Рекурсивный поиск и замена элементов массива PHP

Я хочу рекурсивно искать и заменять элементы в массиве.

Массив имеет дерево, поэтому выглядит так:

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; } 

спасибо, что забрал меня!