【PHP】配列おさらい〜結合編

現在、データベースから受け取ったデータ（配列形式）を編集しようと四苦八苦しています。特に配列同士の結合は関数によって微妙に動作が違い、理解に苦労しました。

今回、その過程で調べた関数をまとめてみました。

# 使用する配列

こちらのサイトから拝借。（少し編集しました。）

>[FuelPHP1.7 Documentation ~ Arr クラス](http://fuelphp.jp/docs/1.7/classes/arr.html)

```test.php
$city_1 = array('Tokyo', 'Nagoya', 'Kyoto');

$city_2 = array('Osaka', 'Nagano', 'Yokohama');

$col_1 = array(
    'id' => 1,
    'name' => 'Bill',
    'age' => 33,
    'country' => 'America',
);

$col_2 = array(
    'id' => 2,
    'name' => 'Chris',
    'age' => 54,
    'country' => 'Canada',
);
```

```test.php
print_r($city_1);

/* 結果
Array
(
    [0] => Tokyo
    [1] => Nagoya
    [2] => Kyoto
)
*/

print_r($city_2);

/* 結果
Array
(
    [0] => Osaka
    [1] => Nagano
    [2] => Yokohama
)
*/

print_r($col_1);

/* 結果
Array
(
    [id] => 1
    [name] => Bill
    [age] => 33
    [country] => America
)
*/

print_r($col_2);

/* 結果
Array
(
    [id] => 2
    [name] => Chris
    [age] => 54
    [country] => Canada
)
*/
```

# 結合する

様々な方法がありますが、添字配列と連想配列で動作が異なったりするので要注意です。

## array_merge

### 添字配列

そのまま後ろに結合されます。

```test.php
print_r(array_merge($city_1, $city_2));

/* 結果
Array
(
    [0] => Tokyo
    [1] => Nagoya
    [2] => Kyoto
    [3] => Osaka
    [4] => Nagano
    [5] => Yokohama
)
*/
```

### 連想配列

キーが同じ配列を結合しようとすると、後ろの配列に上書きされてしまいます。異なるキーであれば上書きはされません。

```test.php
print_r(array_merge($col_1, $col_2));

/* 結果
Array
(
    [id] => 2
    [name] => Chris
    [age] => 54
    [country] => Canada
)
*/
```

## array_push

### 添字配列

追加する内容に配列を指定すると、その配列自体が１つの要素として加わります。

```test.php
array_push($city_1, $city_2);
print_r($city_1);

/* 結果
Array
(
    [0] => Tokyo
    [1] => Nagoya
    [2] => Kyoto
    [3] => Array
        (
            [0] => Osaka
            [1] => Nagano
            [2] => Yokohama
        )

)
*/
```

配列ではなく要素を指定すれば、そのまま追加されます。

```test.php
array_push($city_1, 'Naha');
print_r($city_1);

/* 結果
Array
(
    [0] => Tokyo
    [1] => Nagoya
    [2] => Kyoto
    [3] => Naha
)
*/
```

### 連想配列

添字配列と同じ動作をします。追加した配列自体が１つの要素として加わっています。

```test.php
array_push($col_1, $col_2);
print_r($col_1);

/* 結果
Array
(
    [id] => 1
    [name] => Bill
    [age] => 33
    [country] => America
    [0] => Array
        (
            [id] => 2
            [name] => Chris
            [age] => 54
            [country] => Canada
        )

)
*/
```

先に空の配列を用意してそれに追加する形で指定すれば、多重配列になりますが、まとまった結果が得られます。

```test.php
$col_0 = array();
array_push($col_0, $col_1);
array_push($col_0, $col_2);
print_r($col_0);

/* 結果
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Bill
            [age] => 33
            [country] => America
        )

    [1] => Array
        (
            [id] => 2
            [name] => Chris
            [age] => 54
            [country] => Canada
        )

)
*/
```

## 演算子を利用

すでに同じ添字が存在する場合、上書きはされず、追加もされません。

### 添字配列 

```test.php
print_r($city_1 + $city_2);

/* 結果
Array
(
    [0] => Tokyo
    [1] => Nagoya
    [2] => Kyoto
)
*/
```

### 連想配列

こちらも添字配列と同じです。すでに同じキーが存在するため、上書きも追加もされません。

```test.php
print_r($col_1 + $col_2);

/* 結果
Array
(
    [id] => 1
    [name] => Bill
    [age] => 33
    [country] => America
)
*/
```

## array_merge_recursive

### 添字配列

array_mergeと同じ結果になりました。

```test.php
print_r(array_merge_recursive($city_1, $city_2));

/* 結果
Array
(
    [0] => Tokyo
    [1] => Nagoya
    [2] => Kyoto
    [3] => Osaka
    [4] => Nagano
    [5] => Yokohama
)
*/
```

### 連想配列

この関数が役に立つのは連想配列の場合です。キーごとに各要素がまとめられます。

```test.php
print_r(array_merge_recursive($col_1, $col_2));

/* 結果
Array
(
    [id] => Array
        (
            [0] => 1
            [1] => 2
        )

    [name] => Array
        (
            [0] => Bill
            [1] => Chris
        )

    [age] => Array
        (
            [0] => 33
            [1] => 54
        )

    [country] => Array
        (
            [0] => America
            [1] => Canada
        )

)
*/
```

長くなりそうなので、次回に続きます。