32
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-25

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

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

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

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

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

しかも実用的:sunglasses:

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

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

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

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

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

<?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をお願いします。

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

32
15
2

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
32
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?