今回は、PHPの参照渡しを使い、都道府県と市区町村の配列のデータを紐付けます。例えば、北海道なら「札幌市」「旭川市」のように一つの配列の中に入れていきます。

参照渡しは、どうしても必要じゃないとき以外は使用しない方が良いと、よく言われています。ただし、他人が書いたコードを修正する時などに参照渡しが出て来たりしたりして、どうしても避けて通れないこともあるのではないでしょうか。

とりあえず、参照渡しを使ったコードと、そうでないコードを比較出来るように2つコードを書きます。

参照渡しを使ったコード

foreachで参照渡しを使っています。

$pref = [
	['id' => 1, 'name' => '北海道'],
	['id' => 2, 'name' => '青森県'],
	['id' => 3, 'name' => '秋田県']
];

$city = [
	['id' => 1, 'name' => '札幌市'],
	['id' => 1, 'name' => '旭川市'],
	['id' => 1, 'name' => '函館市'],
	['id' => 2, 'name' => '青森市'],
	['id' => 2, 'name' => '弘前市'],
	['id' => 2, 'name' => '八戸市'],
	['id' => 3, 'name' => '秋田市'],
	['id' => 3, 'name' => '能代市'],
	['id' => 3, 'name' => '横手市']
];

foreach ($pref as $key => &$value) {
	foreach ($city as $key2 => $value2) {
		if ($value['id'] === $value2['id']) {
			$value['data'][] = $value2['name'];
		}
	}
}
echo "<pre>";
print_r($pref);
echo "</pre>";

参照渡しを使わないコード

上部のコードと違い、foreachで参照渡しは使っていません。

$pref = [
	['id' => 1, 'name' => '北海道'],
	['id' => 2, 'name' => '青森県'],
	['id' => 3, 'name' => '秋田県']
];

$city = [
	['id' => 1, 'name' => '札幌市'],
	['id' => 1, 'name' => '旭川市'],
	['id' => 1, 'name' => '函館市'],
	['id' => 2, 'name' => '青森市'],
	['id' => 2, 'name' => '弘前市'],
	['id' => 2, 'name' => '八戸市'],
	['id' => 3, 'name' => '秋田市'],
	['id' => 3, 'name' => '能代市'],
	['id' => 3, 'name' => '横手市']
];

foreach ($pref as $key => $value) {
	foreach ($city as $key2 => $value2) {
		if ($value['id'] === $value2['id']) {
			$pref[$key]['data'][] = $value2['name'];
		}
	}
}
echo "<pre>";
print_r($pref);
echo "</pre>";

出力結果

参照渡しを使ったコードとそうでないコードは、いずれも以下の結果が出力されます。

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 北海道
            [data] => Array
                (
                    [0] => 札幌市
                    [1] => 旭川市
                    [2] => 函館市
                )

        )

    [1] => Array
        (
            [id] => 2
            [name] => 青森県
            [data] => Array
                (
                    [0] => 青森市
                    [1] => 弘前市
                    [2] => 八戸市
                )

        )

    [2] => Array
        (
            [id] => 3
            [name] => 秋田県
            [data] => Array
                (
                    [0] => 秋田市
                    [1] => 能代市
                    [2] => 横手市
                )

        )

)

参照渡しを使った方がコードがシンプルになりますが、そんなに必要性を感じないので、個人的には使わなくても良いのかなと思います。

以上です。