Обновить значение многомерного массива в зависимости от другого родственного значения

#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, еще раз спасибо