PHP array_mergeの挙動について
- 2019年7月18日
- Web Service
今回の記事はPHPの「array_merge」の挙動について確認をおこなった際の記録になります。
以下の2つの配列があり、「$addProductsYearList」を数値添字要素、「$addProductsNameList」を値として、あらたに連想配列「$postProductList」を作成したい場合を考えてみます。
$addProductsYearList = array(1998,2001,2007);
$addProductsNameList = array("iMac","iPod","iPhone");
以下のコードを書いてみて、想定通りに動作するか試してみました。
$addProductsYearList = array(1998,2001,2007);
$addProductsNameList = array("iMac","iPod","iPhone");
$postProductList = array();
$nmpos = 0;
foreach ($addProductsYearList as $prodYear) {
$postProductList = array_merge($postProductList, array($prodYear => $addProductsNameList[$nmpos]));
$nmpos++;
}
var_dump($postProductList);
上記の実行結果
array (size=3)
0 => string 'iMac' (length=4)
1 => string 'iPod' (length=4)
2 => string 'iPhone' (length=6)
想定していた実行結果
array (size=3)
1998 => string 'iMac' (length=4)
2001 => string 'iPod' (length=4)
2007 => string 'iPhone' (length=6)
各Productsの発売年を数値添字要素として連想配列に保持しておきたかったのですが、0から始まる連番に置き換えられており、想定通り動作しませんでした。
それでは、YearとNameを逆にしてみてはどうでしょうか。こちらを試してみた結果が以下です。
YearとNameを逆にしたコード
$addProductsYearList = array(1998,2001,2007);
$addProductsNameList = array("iMac","iPod","iPhone");
$postProductList = array();
$nmpos = 0;
foreach ($addProductsYearList as $prodYear) {
$postProductList = array_merge($postProductList, array($addProductsNameList[$nmpos] => $prodYear));
$nmpos++;
}
var_dump($postProductList);
上記の実行結果
array (size=3)
'iMac' => int 1998
'iPod' => int 2001
'iPhone' => int 2007
この場合、各Productsの発売年は保持されていました。数値添字要素の部分に任意の数値が入っていた場合に、連番に上書きされるという現象が発生するようです。
この現象について公式ドキュメントで調べてみました。
https://www.php.net/manual/ja/function.array-merge.php
公式ドキュメントによると『入力配列の中にある数値添字要素の添字の数値は、結果の配列ではゼロから始まる連続した数値に置き換えられます』とのことでした。
そのような仕様のようです。
解決方法についても上記の公式ドキュメント内に記載がありましたので、以下のようにコードを書き換えて試してみました。
$addProductsYearList = array(1998,2001,2007);
$addProductsNameList = array("iMac","iPod","iPhone");
$postProductList = array();
$nmpos = 0;
foreach ($addProductsYearList as $prodYear) {
$postProductList = $postProductList+array($prodYear => $addProductsNameList[$nmpos]);
$nmpos++;
}
var_dump($postProductList);
上記の実行結果
array (size=3)
1998 => string 'iMac' (length=4)
2001 => string 'iPod' (length=4)
2007 => string 'iPhone' (length=6)
これで想定通り動作しました。
さらにシンプルに処理を記述する場合は以下の記述方法で同様の処理が実現可能です。
$addProductsYearList = array(1998,2001,2007);
$addProductsNameList = array("iMac","iPod","iPhone");
$postProductList = array();
$nmpos = 0;
foreach ($addProductsYearList as $prodYear) {
$postProductList[$prodYear] = $addProductsNameList[$nmpos];
$nmpos++;
}
var_dump($postProductList);
木曜日担当:nishida
nishida at 2019年07月18日 10:00:02