配列結合 array_merge() と 演算子の違い

2019/04/25

PHPの配列は他の言語と比べて若干癖がある。 インデックスが 型が整数か文字列とか連番でなくてもよいとかゆるいので、ある意味柔軟なデータを生成する事もできる。 (ここら辺は言語思想)

PHP配列の結合は「array_merge() 」が一般的かも知れないが、演算子でも計算できる。 ただし、インデックスによって結果が異なるので注意が必要。

  • インデックスが同じ、異なる
  • 値が同じ、異なる

の組み合わせで考察してみる。

事前に結合するサンプルデータを作成しておく(例では10個ずつ)。

    function generateValues($count, $prefix = 'test', $from_index = 1)
    {
        for ($i = $from_index; $i <= $count + $from_index; $i++) $values[$i] = "{$prefix}{$i}";
        return $values;
    }
$values1 = 
array (
  0 => 'test0',
  1 => 'test1',
  2 => 'test2',
  3 => 'test3',
  4 => 'test4',
  5 => 'test5',
  6 => 'test6',
  7 => 'test7',
  8 => 'test8',
  9 => 'test9',
)
$values2 = 
array (
  0 => 'test0',
  1 => 'test1',
  2 => 'test2',
  3 => 'test3',
  4 => 'test4',
  5 => 'test5',
  6 => 'test6',
  7 => 'test7',
  8 => 'test8',
  9 => 'test9',
)

$values1 + $values2 の結合(インデックス同じ、値同じ)

$values1 + $values2 を演算子「+」で結合してみる。

//values1 + values2
$values1 = $array_merge->generateValues(10);
$values2 = $array_merge->generateValues(10);
$values = $values1 + $values2;
$values1 + $values2 = 
array (
  0 => 'test0',
  1 => 'test1',
  2 => 'test2',
  3 => 'test3',
  4 => 'test4',
  5 => 'test5',
  6 => 'test6',
  7 => 'test7',
  8 => 'test8',
  9 => 'test9',
)

インデックスが同じだと結合できない。 またどちらの配列が採用されているかわからないので、値の違う配列を作成して調べる。

$values1 + $values2 の結合(インデックス同じ、値異なる)

//values1 + values2
$values1 = $array_merge->generateValues(10, 'red');
$values2 = $array_merge->generateValues(10, 'blue');
$values = $values1 + $values2;
$values1 = 
array (
  0 => 'red0',
  1 => 'red1',
  2 => 'red2',
  3 => 'red3',
  4 => 'red4',
  5 => 'red5',
  6 => 'red6',
  7 => 'red7',
  8 => 'red8',
  9 => 'red9',
)
$values2 = 
array (
  0 => 'blue0',
  1 => 'blue1',
  2 => 'blue2',
  3 => 'blue3',
  4 => 'blue4',
  5 => 'blue5',
  6 => 'blue6',
  7 => 'blue7',
  8 => 'blue8',
  9 => 'blue9',
)
$values1 + $values2 = 
array (
  0 => 'red0',
  1 => 'red1',
  2 => 'red2',
  3 => 'red3',
  4 => 'red4',
  5 => 'red5',
  6 => 'red6',
  7 => 'red7',
  8 => 'red8',
  9 => 'red9',
)

上書きされずに最初の配列が採用されていることがわかる。

array_merge($values1, $values2)での結合(インデックス同じ、値同じ)

同じ内容の配列を array_merge() するとインデックスが振り直された配列を返す。

$values = array_merge($values1, $values2);
array (
  0 => 'test0',
  1 => 'test1',
  2 => 'test2',
  3 => 'test3',
  4 => 'test4',
  5 => 'test5',
  6 => 'test6',
  7 => 'test7',
  8 => 'test8',
  9 => 'test9',
  10 => 'test0',
  11 => 'test1',
  12 => 'test2',
  13 => 'test3',
  14 => 'test4',
  15 => 'test5',
  16 => 'test6',
  17 => 'test7',
  18 => 'test8',
  19 => 'test9',
)

今度は、インデックスの異なる配列で試してみる。 配列の作成は以下で作成

    function generateValuesWithIndex($count, $prefix = 'test')
    {
        for ($i = 0; $i < $count; $i++) {
            $values[$this->index++] = "{$prefix}{$i}";
        }
        return $values;
    }
$values1 = 
array (
  0 => 'test0',
  1 => 'test1',
  2 => 'test2',
  3 => 'test3',
  4 => 'test4',
  5 => 'test5',
  6 => 'test6',
  7 => 'test7',
  8 => 'test8',
  9 => 'test9',
)
$values2 = 
array (
  20 => 'test0',
  21 => 'test1',
  22 => 'test2',
  23 => 'test3',
  24 => 'test4',
  25 => 'test5',
  26 => 'test6',
  27 => 'test7',
  28 => 'test8',
  29 => 'test9',
)

$values1 + $values2 の結合(インデックス異なる、値同じ)

$values = $values1 + $values2;
$values1 + $values2 = 
array (
  0 => 'test0',
  1 => 'test1',
  2 => 'test2',
  3 => 'test3',
  4 => 'test4',
  5 => 'test5',
  6 => 'test6',
  7 => 'test7',
  8 => 'test8',
  9 => 'test9',
  20 => 'test0',
  21 => 'test1',
  22 => 'test2',
  23 => 'test3',
  24 => 'test4',
  25 => 'test5',
  26 => 'test6',
  27 => 'test7',
  28 => 'test8',
  29 => 'test9',
)

インデックスを保持したまま結合できる。

array_merge($values1, $values2)での結合(インデックス異なる、値同じ)

$values = array_merge($values1, $values2);
array (
  0 => 'test0',
  1 => 'test1',
  2 => 'test2',
  3 => 'test3',
  4 => 'test4',
  5 => 'test5',
  6 => 'test6',
  7 => 'test7',
  8 => 'test8',
  9 => 'test9',
  10 => 'test0',
  11 => 'test1',
  12 => 'test2',
  13 => 'test3',
  14 => 'test4',
  15 => 'test5',
  16 => 'test6',
  17 => 'test7',
  18 => 'test8',
  19 => 'test9',
)

インデックスが振り直されて結合される。