【PHP Tips】配列の中の配列に新規で要素を追加する方法

PHP
スポンサーリンク

概要

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後:

参照渡ししない場合はどうなるか

当然ですが、値渡し(変数に値のデータを渡すだけ)になるので配列自体の更新ができません。

コメント

タイトルとURLをコピーしました