Замена определенных элементов в многомерном массиве

#php #arrays #multidimensional-array

#php #массивы #многомерный-массив

Вопрос:

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

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

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

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

Спасибо!

Комментарии:

1. Я думаю, что рекурсия — лучший способ.

2. Чем вы хотите его заменить?

Ответ №1:

Взгляните на 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(amp;$item, $key)
{
    if($key == 'something')
        $item = 'newValue';
}

array_walk_recursive($arr, 'update_something');
  

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

 array_walk_recursive($arr, array($this, 'update_something'));
  

Комментарии:

1. Можно ли это сделать внутри класса? Я должен вызывать свои функции, используя $this-> functionName

2. Это не должно быть проблемой 🙂 Вот пример array_walk_recursive($arr, array($this, 'update_something'));

3. array_walk_recursive($arr, [__CLASS__,'update_something']); Это просто эстетические предпочтения :))

Ответ №2:

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

 /**
 * 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(amp;$v, $k) use ($key, $value)
        {$k == $key amp;amp; $v = $value;});
    return $array;
}

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

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