#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
, но инкапсулирован. Ключ и значение могут быть указаны как параметры функции, а не жестко закодированы в каком-либо обратном вызове, поэтому он более гибкий.