Заменить определенные элементы в многомерном массиве - PullRequest
4 голосов
/ 18 октября 2011

У меня есть массив, который может варьироваться в зависимости от количества массивов, например:

        array(
              'one' => array(
                             array(
                                'something' => 'value'
                                ),
                             array(
                                'something2' => 'value2'
                                ),
                             'another' => 'anothervalue'
                             ),
              'two' =>  array(
                             array(
                                'something' => 'value'
                                ),
                             array(
                                'something2' => 'value2'
                                ),
                             'another' => 'anothervalue'
                             )
              )

Теперь, допустим, я хочу заменить все ключом "что-то".

Нужно ли мне использовать рекурсивную функцию для перебора массива? или есть лучший способ?

Спасибо!

Ответы [ 2 ]

10 голосов
/ 18 октября 2011

Посмотрите на array_walk_recursive. Это может быть очень удобно в такой ситуации.

Вот пример использования array_walk_recursive:

$arr = array(
      'one' => array(
            array('something' => 'value'),
            array('something2' => 'value2'),
            'another' => 'anothervalue'
            ),
      'two' =>  array(
            array('something' => 'value'),
            array('something2' => 'value2'),
            'another' => 'anothervalue'
            )
       );

function update_something(&$item, $key)
{
    if($key == 'something')
        $item = 'newValue';
}

array_walk_recursive($arr, 'update_something');

Если используется внутри класса, метод обратного вызова должен добавить объект вместе с функцией. Это достигается с помощью массива:

array_walk_recursive($arr, array($this, 'update_something'));
2 голосов
/ 18 октября 2011

Это функция, которую вы можете использовать как глобальную функцию или просто поместить в класс:

/**
 * replace any value in $array specified by $key with $value
 *
 * @return array array with replaced values
 */
function replace_recursive(Array $array, $key, $value)
{
    array_walk_recursive($array, function(&$v, $k) use ($key, $value)
        {$k == $key && $v = $value;});
    return $array;
}

# usage:
$array = replace_recursive($array, 'something', 'replaced');

Она также использует array_walk_recursive, но инкапсулирована.Ключ и значение могут быть заданы в качестве параметров функции и не закодированы в некоторых обратных вызовах, поэтому они более гибкие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...