【PHP】超実用的！リファレンスの使用（≒参照渡し）をせずに配列の中身をイジろう

#はじめに
ちょっと前に書いた
[**「【PHP】全ボクが実務で泣いた「値渡し」と「参照渡し」を完！全！理！解」**](https://qiita.com/shimotaroo/items/4486b94efc01920f1ec5)
で連想配列の中身をいじる時に~~**参照渡し**~~**<font color="red">リファレンスの使用**</font>を使いました。

（前の記事でコメントをいただいたのですが、正確には**参照渡し**ではなく**リファレンスの使用**と言うらしいです）

※その違いについては上記の記事のコメント欄をチェックしてください。

が、前述の方法では後続の処理が上手くいきませんでした。

そんな時に先輩にこの記事でご紹介する方法を教えてもらったのでまとめます。

しかも実用的:sunglasses:

#この記事のオススメ読者

- **実務に入ったばかりの方**
- **これから実務に入る予定の方**

**3分**もあれば全部読めるのでサクッと読んでみてください:wink:


#リファレンスの使用（≒参照渡し）をせずに配列の中身をこねくり回す方法

上記の記事と同じコードを使います。

```php
<?php

// 配列を2つ定義
$members = [
    'Aさんの好きな果物' => [
        'りんご' => 'apple',
        'ぶどう' => 'grape',
        'バナナ' => 'banana',
    ],
    'Bさんの好きな果物' => [
        'マンゴー' => 'mango',
        'パイナップル' => 'pineapple',
        'ドラゴンフルーツ' => 'dragon fruit',
    ],
];
$fruits = [
    'ざくろ' => 'pomegranate',
    'オレンジ' => 'orange',
    'もも' => 'peach',
];

// $membersに$fruitsの要素を追加
foreach ($members as &$member) {
    $member['ざくろ'] = $fruits['ざくろ'];
    $member['もも'] = $fruits['もも'];
}

// 配列を出力
var_dump($members);
```

foreachの中の

```php
&$member
```

これが~~**参照渡し**~~**リファレンス渡し**を表す書き方。

で、これを使わずに欲しい内容を出力する方法はこちら！ドン！

```php
<?php

// 配列を2つ定義
$members = [
    'Aさんの好きな果物' => [
        'りんご' => 'apple',
        'ぶどう' => 'grape',
        'バナナ' => 'banana',
    ],
    'Bさんの好きな果物' => [
        'マンゴー' => 'mango',
        'パイナップル' => 'pineapple',
        'ドラゴンフルーツ' => 'dragon fruit',
    ],
];
$fruits = [
    'ざくろ' => 'pomegranate',
    'オレンジ' => 'orange',
    'もも' => 'peach',
];

// $membersに$fruitsの要素を追加
foreach ($members as $index => $member) {
    $members[$index]['ざくろ'] = $fruits['ざくろ'];
    $members[$index]['もも'] = $fruits['もも'];
}

// 出力
var_dump($members);
```

出力結果

```php
array(2) {
  ["Aさんの好きな果物"]=>
  array(5) {
    ["りんご"]=>
    string(5) "apple"
    ["ぶどう"]=>
    string(5) "grape"
    ["バナナ"]=>
    string(6) "banana"
    ["ざくろ"]=>
    string(11) "pomegranate"
    ["もも"]=>
    string(5) "peach"
  }
  ["Bさんの好きな果物"]=>
  array(5) {
    ["マンゴー"]=>
    string(5) "mango"
    ["パイナップル"]=>
    string(9) "pineapple"
    ["ドラゴンフルーツ"]=>
    string(12) "dragon fruit"
    ["ざくろ"]=>
    string(11) "pomegranate"
    ["もも"]=>
    string(5) "peach"
  }
}
```

ちゃんと各配列に要素が2つ追加されてます！！

変更したのは

```php
foreach ($members as &$member) {
    $member['ざくろ'] = $fruits['ざくろ'];
    $member['もも'] = $fruits['もも'];
}
```

ここを

```php
foreach ($members as $index => $member) {
    $members[$index]['ざくろ'] = $fruits['ざくろ'];
    $members[$index]['もも'] = $fruits['もも'];
}
```

こう変えました。

#コードの説明（簡単に）

```php
foreach ($members as $index => $member) {
    $members[$index]['ざくろ'] = $fruits['ざくろ'];
    $members[$index]['もも'] = $fruits['もも'];
}
```

まず、`foreach ($members as $index => $member) `で、1つ目の連想配列については

- `$index`：'Aさんの好きな果物'
- `$members`:

```php
[
    'りんご' => 'apple',
    'ぶどう' => 'grape',
    'バナナ' => 'banana',
]
```

です。

なので `$members[$index]['ざくろ'] = $fruits['ざくろ'];`とすることにより、

```php
$members['Aさんの好きな果物']['ざくろ'] = 'pomegranate';
```

となります。

つまり、元の連想配列`members`に要素を追加することができているわけですね。
`$members[$index]['もも'] = $fruits['もも'];`も同様なので割愛。

このようにすると、**リファレンスの使用**を使わなくてもforeachを使っても配列の中身をイジることが可能です。

（面白いことに`$member`は使わないんですよね）

#おわり

**この方法、結構使えます！実務でも結構使ってます！オススメです！**

連想配列の扱い方が上手くなれば実務での開発スピードは結構上がるなと日々痛感してます。
（もちろん他のスキルもたくさんいるけどw）

もし内容を気に入っていただけたら<font color="green">**LGTM**</font>をお願いします。

最後まで読んでいただきありがとうございました:bow: