0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【備忘録】array_mergeはキーが数値の時は再採番される

Posted at

初めに

配列を結合するarray_mergeですが、配列のキーが数値の時と文字列の時とで動作が少し異なります。
array_mergeはキーが数値の場合、ゼロから始まる連続した数値に置き換えられてしまいます

以下公式ドキュメントの抜粋。

入力配列の中にある数値添字要素の添字の数値は、 結果の配列ではゼロから始まる連続した数値に置き換えられます

試してみる

例えば、キーが文字列の配列を結合してもキーは変わりません。

<?php
$array1 = ['key1' => 'one', 'key2' => 'two'];
$array2 = ['key4' => 'four', 'key7' => 'seven'];

var_dump(array_merge($array1, $array2));
結果
array(4) {
    ["key1"] => string(3) "one"
    ["key2"] => string(3) "two"
    ["key4"] => string(4) "four"
    ["key7"] => string(5) "seven"
}

しかし、キーが数値の配列を結合すると、キーが変わってしまいます。

<?php
$array1 = [1 => 'one', 2 => 'two'];
$array2 = [4 => 'four', 7 => 'seven'];

var_dump(array_merge($array1, $array2));
結果
array(4) {
    [0] => string(3) "one"
    [1] => string(3) "two"
    [2] => string(4) "four"
    [3] => string(5) "seven"
}

ちなみに、シングルクォーテーションで囲んでも数値扱いでキーが変わります。

<?php
$array1 = ['1' => 'one', '2' => 'two'];
$array2 = ['4' => 'four', '7' => 'seven'];

var_dump(array_merge($array1, $array2));
結果
array(4) {
    [0] => string(3) "one"
    [1] => string(3) "two"
    [2] => string(4) "four"
    [3] => string(5) "seven"
}

キーを変えたくない場合はどうするべきか

array_mergeは使わずに+を使うことでキーを保つことができました。

<?php
$array1 = [1 => 'one', 2 => 'two'];
$array2 = [4 => 'four', 7 => 'seven'];

// var_dump(array_merge($array1, $array2));
var_dump($array1 + $array2);
結果
array(4) {
    [1] => string(3) "one"
    [2] => string(3) "two"
    [4] => string(4) "four"
    [7] => string(5) "seven"
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?