#php #arrays #recursion
#php #массивы #рекурсия
Вопрос:
У меня есть массив, в котором может быть до n элементов.
(
[children] => Array
(
[0] => Array
(
[id] => nhbs0123620cf897
[title] => Introduction
[children] => Array
(
[0] => Array
(
[id] => bylff0a76617c8
[title] => Courent3
[children] => Array
(
)
)
[1] => Array
(
[id] => xavs26efa2f51eb
[title] => Chapter
[children] => Array
(
)
)
[2] => Array
(
[id] => iezkd241d9d90
[title] => external
[children] => Array
(
)
)
[3] => Array
(
[id] => gmzh439c4f50
[title] => audio
[children] => Array
(
)
)
[4] => Array
(
[id] => niugd4e18b0
[title] => url
[children] => Array
(
)
)
[5] => Array
(
[id] => unpgdb1b7694
[title] => new
[children] => Array
(
)
)
[6] => Array
(
[id] => ssvc2025c0c8a
[title] => simple
[children] => Array
(
[0] => Array
(
[id] => ssvc2025c0c
[title] => later
[children] => Array
(
)
)
)
)
)
)
[1] => Array
(
[id] => rwtae5d9482
[title] => Summary
[children] => Array
(
[0] => Array
(
[id] => ssvc2025c0
[title] => later
[children] => Array
(
)
)
)
)
[2] => Array
(
[id] => rwtae5d9482709
[title] => Course
[children] => Array
(
)
)
)
)
Здесь я хочу обновить значение заголовка в зависимости от идентификатора для каждого элемента в массиве.
Что я пробовал
1 используется array_walk_recursive здесь я могу обновлять данные, но при обновлении не удается проверить значение идентификатора.
array_walk_recursive(array, function(amp;$value, $key) {
// not able to check if id == 'something' .this is what i need
if ($key == 'title') {
$value = 'updated data';
}
});
Вторая попытка для каждого цикла, но не удалось сохранить индекс массива для получения фактического массива
function myfun($array,amp;$out){
foreach($array['children'] as $key=>$val){
if(!empty($val['children'])){
$out['children'][$key]['title'] = $val['title']; // this is not right key
$this->myfun($val,$out['children']);
}else{
$out['children'][$key]['title'] = $val['title']; // this is not right key
}
}
}
здесь также не удается вернуть массив в массиве $out.
Единственное, что у меня есть, это дочерний ключ, использующий это, если можно записать какую-либо функцию.
Я надеюсь, что это должно быть возможно в функциях массива php.
Ответ №1:
Вы близки — все, что вам нужно, это использовать amp;
— это отправит массив в качестве ссылки, поэтому любые изменения в нем будут в исходном массиве. Можете посмотреть в руководстве по PHP для получения дополнительных знаний.
Рассмотрим следующее:
$arr = [["id" => 1, "title" => "aaa", "children" => []], ["id" => 2, "title" => "bbb", "children" => [["id" => 3, "title" => "ccc", "children" => []]]]];
function modifyTitle(amp;$arr, $id, $newVal) {
foreach($arr as amp;$e) {
if ($e["id"] == $id)
$e["title"] = $newVal;
modifyTitle($e["children"], $id, $newVal);
}
}
modifyTitle($arr, 3, "zzz");
print_r($arr); // now the original array children changed
Живой пример:https://3v4l.org/ZbiB9
Комментарии:
1. Спасибо, это сработало! эта передача значения по ссылке была трюком, который я пропустил для foreach, еще раз спасибо