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


はじめに

ちょっと前に書いた
「【PHP】全ボクが実務で泣いた「値渡し」と「参照渡し」を完!全!理!解」
で連想配列の中身をいじる時に参照渡しリファレンスの使用を使いました。

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

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

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

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

しかも実用的

この記事のオススメ読者

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

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

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

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

<?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の中の

&$member

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

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

<?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);

出力結果

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つ追加されてます!!

変更したのは

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

ここを

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

こう変えました。

コードの説明(簡単に)

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

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

  • $index:'Aさんの好きな果物'
  • $members:
[
    'りんご' => 'apple',
    'ぶどう' => 'grape',
    'バナナ' => 'banana',
]

です。

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

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

となります。

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

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

(面白いことに$memberは使わないんですよね)

おわり

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

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

もし内容を気に入っていただけたらLGTMをお願いします。

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