Я хочу рекурсивно искать и заменять элементы в массиве.
Массив имеет дерево, поэтому выглядит так:
Object Children Object type A Object type B Object Children Object type A Object
и т.п.
Я хочу, чтобы иметь возможность заменять некоторые элементы другими элементами, например, я хочу заменить все записи в массиве (на любом уровне глубины) типа A с массивом типа B. Но вот улов: вновь замененный объекты могут также иметь детей типа A, которые необходимо заменить.
Пока у меня есть
foreach($nodes as &$node) { // Replace node? if($node['type'] == 'RefObject') { $n = $this->site->get_node_where('id', $node['node_ref']); // Replace node $node = $this->site->get_node_where('object_id', $n['object_id']); // Get children $node['children'] = $this->site->get_descendants($node['lft'], $node['rgt']); } } return $nodes;
Что заменит первый уровень RefObjects, но не будет искать дочерние элементы, добавленные впоследствии.
Я несколько часов бил головой о стену. Пожалуйста помоги!
Привет, Газ.
Поместите свой код в функцию и вызовите его еще раз. псевдокод:
function checkArray($array) { ... if (is_array($node)) { // or whatever other criterium checkArray($node); // same function } }
Основы рекурсии – снова вызвать тот же код …
вам нужно добавить этот код в функцию и вызвать функцию на дочерних узлах.
что-то вроде этого (обратите внимание, что функция parseNodes вызывается снова внутри функции):
function parseNodes($node) { foreach($nodes as &$node) { // Replace node? if($node['type'] == 'RefObject') { $n = $this->site->get_node_where('id', $node['node_ref']); // Replace node $node = $this->site->get_node_where('object_id', $n['object_id']); // Get children $node['children'] = parseNodes($this->site->get_descendants($node['lft'], $node['rgt'])); } } return $nodes; }
мистифицировать
PHP 5.3 получает метод array_replace_recursive .
Я просто надеюсь, что вы сможете его использовать;)
http://www.php.net/manual/fr/function.array-replace-recursive.php
здесь рекурсивное решение
function makeObject($array){ $data = false; foreach($array as $key=>$value){ if(is_array($value)){ $value = makeObject($value); } $data -> {$key} = $value; } return $data; }
спасибо, что забрал меня!