-
複数の配列の結合・合体には便利な関数「array_merge」を使うが、思わぬところに落とし穴・・・・
現在開発中の案件で幾つかのCSVファイル(ログファイル)を読み取って、連想配列に格納後、ひとつの配列に合体させようと普通にarray_mergeを使う。
ところがエラーで結合が出来ない。
いろいろ調べてみると、PHP5からarray_mergeの仕様が変わったみたい。
PHP本家サイトで警告表示で
「array_merge() の動作は PHP 5 で変更されました。PHP 4 とは異なり、 array_merge() は、array 型のパラメータのみを受け取るようになりました。しかし、 他の型をマージするために型キャストを使用することも可能です。 詳細は以下の例を参照してください。」
とのこと。
って事で以下にPHP4〜5どちらも対応できるサンプルを書いておきます。
-
連想配列同士の結合
<?php
$data1 = array(
array(
'name' => '山田 太郎',
'email' => 'taro@yamda.jap',
),
array(
'name' => '山田 花子',
'email' => 'hanako@yamda.jap',
)
);
$data2 = array(
array(
'name' => '佐藤 幸一',
'email' => 'koichi@sato.jap',
),
array(
'name' => '佐藤 幸二',
'email' => 'koji@sato.jap',
)
);
$result = phpversion() > '5' ? array_merge($data1, $data2) : array_merge((array)$data1, (array)$data2);
print_r($result);
/*
Array
(
[0] => Array
(
[name] => 山田 太郎
[email] => taro@yamda.jap
)
[1] => Array
(
[name] => 山田 花子
[email] => hanako@yamda.jap
)
[2] => Array
(
[name] => 佐藤 幸一
[email] => koichi@sato.jap
)
[3] => Array
(
[name] => 佐藤 幸二
[email] => koji@sato.jap
)
)
*/
?>
複数のCSVファイルを読み取って合体させるサンプル。
CSVの中身は上記と同様、名前,メールアドレスとしてある。
<?php
$csv = array('1.csv', '2.csv');
$result = array();
foreach($csv as $filename) {
$csvData = csvReading($filename);
$result = phpversion() > '5' ? array_merge($result, $csvData) : array_merge((array)$result, (array)$csvData);
}
print_r($result);
//出力は上記と同じ
function csvReading($filename) {
$fp = fopen($filename, 'r');
setlocale(LC_ALL, 'ja_JP.SJIS'); //日本語文字化け対策
while(($data = fgetcsv($fp, 1000, ",")) !== false) {
$object[] = array("name" => $data[0], "email" => $data[1]);
}
fclose($fp);
return $object;
}
?>