概要
foreach文を使用して、配列の中の配列に新規で要素を追加したいときは、参照渡しで配列を指定する必要があります。また、参照渡しをした場合は忘れずにunsetを行います。
【良い例】参照渡しでforeachして要素を追加する
参照渡しをする場合は、変数の前に&をつけます。
コード例
<?php
$lists = [
array('name' => '山田太郎'),
array('name' => '鈴木花子')
];
echo "要素追加前".PHP_EOL;
print_r($lists);
// 参照渡しで配列内の配列に要素を追加する
foreach($lists as &$list){
if($list['name'] == '山田太郎'){
$list['sex'] = '男';
}else{
$list['sex'] = '女';
}
$list['job'] = 'プログラマ';
}
unset($list);
echo "要素追加後".PHP_EOL;
print_r($lists);
?>
実行結果
要素追加前
Array
(
[0] => Array
(
[name] => 山田太郎
)
[1] => Array
(
[name] => 鈴木花子
)
)
要素追加後
Array
(
[0] => Array
(
[name] => 山田太郎
[sex] => 男
[job] => プログラマ
)
[1] => Array
(
[name] => 鈴木花子
[sex] => 女
[job] => プログラマ
)
)
unsetを行わないとどうなるか
$list が $lists の最終要素をポイントし続けます。そのため、$listを再度使う場合に予期せぬバグを引き起こすことがあるので、参照渡しをした際は忘れずにunset する必要があります。
検証コード
<?php
$lists = [
array('name' => '山田太郎'),
array('name' => '鈴木花子')
];
foreach($lists as &$list){
if($list['name'] == '山田太郎'){
$list['sex'] = '男';
}else{
$list['sex'] = '女';
}
$list['job'] = 'プログラマ';
}
printf("unset前:".PHP_EOL);
print_r($list);
unset($list);
printf("unset後:".PHP_EOL);
print_r($list);
?>
実行結果
unset前:
Array
(
[name] => 鈴木花子
[sex] => 女
[job] => プログラマ
)
unset後:
参照渡ししない場合はどうなるか
当然ですが、値渡し(変数に値のデータを渡すだけ)になるので配列自体の更新ができません。
コメント