Подтвердить что ты не робот

Значение php insert в массиве массивов с использованием 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 повсюду, кажется, что в "item item" вставляется значение "key3" = > 'val3', если я распечатаю его в цикле, но исходный массив кажется неизменным. Я также пробовал регулярный цикл, но это тоже не сработало.

4b9b3361

Ответ 1

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, где были введены Closures.

Ответ 2

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

if (is_array($item)) { ...

Ответ 3

во время цикла с использованием команды foreach:

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

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

}