PHP array_mergeの挙動について

今回の記事は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



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム