> $rows 行データ * @param string $delimiter 区切り文字 */ public function fromArray(string $path, array $rows, string $delimiter = ','): bool { $fp = fopen($path, 'w'); if ($fp === false) return false; foreach ($rows as $row) { // null を空文字として扱う $normalized = array_map(static function ($v) { return $v === null ? '' : (string) $v; }, $row); fputcsv($fp, $normalized, $delimiter); } fclose($fp); return true; } /** * 配列 → CSV文字列(メモリ構築) * * @param array> $rows 行データ * @param string $delimiter 区切り文字(デフォルト: カンマ) * @param bool $withBom 先頭にUTF-8 BOMを付与するか * @return string CSVテキスト */ public function buildCsvString(array $rows, string $delimiter = ',', bool $withBom = true): string { $stream = fopen('php://temp', 'r+'); if ($stream === false) { return ''; } foreach ($rows as $row) { $normalized = array_map(static function ($v) { return $v === null ? '' : (string) $v; }, $row); fputcsv($stream, $normalized, $delimiter); } rewind($stream); $csv = stream_get_contents($stream) ?: ''; fclose($stream); return $withBom ? ("\xEF\xBB\xBF" . $csv) : $csv; } }