php вставляет значение в массив массивов, используя foreach


У меня есть довольно простой вопрос, но я застрял. Я довольно новичок в php, и у меня есть такой массив:

$array = array(
    'one' => 1,
    'two' => array('key1' => 'val1','key2' => 'val2'),
    'three' => array('key1' => 'val1','key2' => 'val2'),
    'four' => array('key1' => 'val1','key2' => 'val2')
);

И для каждого из массивов в массиве (то есть "два", "три" и "четыре") я хочу вставить "key3" => "val3" в эти массивы.

Я попробовал это:

foreach($array as $item) {
    if (gettype($item) == "array") {
        $item['key3'] = 'val3';
    }
}

Но это не работает, и я не уверен, почему. Используя различные print_r повсюду, кажется, что он вставляет 'key3' => 'val3' в $item, если я распечатаю его в цикле, но исходный массив кажется, ничего не изменилось. Я также попробовал обычный цикл for, но это тоже не сработало.

Author: Benjamin Thvedt, 2013-05-11

3 answers

foreach работает с копией $item, поэтому вы не можете изменить исходный массив внутри foreach. Один из способов обойти это - использовать оператор &.

foreach($array as &$item) {
    if (is_array($item)) {
        $item['key3'] = 'val3';
    }
}

Другим, более элегантным способом было бы использовать array_walk():

array_walk($array, function (&$v, $k) { 
    if (is_array($v)) {
        $v['key3'] = 'val3';
    }
});

Этот пример будет работать с PHP 5.3, где были введены замыкания.

 21
Author: kapa, 2013-05-14 09:36:36

В PHP есть функция для проверки, является ли переменная массивом или нет: is_array(). Используйте это:

if (is_array($item)) { ...
 0
Author: hek2mgl, 2013-05-10 22:33:59

При циклировании с помощью ключа для каждого использования, например:

foreach($array as $key => $item){

    $array[$key]['newElement'] = "newValue";

}
 0
Author: Asad, 2016-01-28 11:28:20