Рекурсия - это то, что вы хотите:
<?php
function walk_array(array $a, &$ra, $path, $depth = 0) {
$id= isset($path[$depth]) ? $path[$depth] : null;
if (!is_null($id)) {
foreach ($a as $a2) {
if ($a2['id'] == $id) {
$ra[$depth]= $a2;
unset($ra[$depth]['copii']);
// This is the key bit - recursion is simply a function calling itself:
if (isset($a2['copii']))
walk_array($a2['copii'], $ra, $path, ++$depth);
}
}
}
}
$complex_array= array(
array('id'=> 1, 'name'=> 'Node #1', 'copii'=> array(
array('id'=> 3, 'name'=> 'Node #3', 'copii'=> array(
array('id'=> 4, 'name'=> 'Node #4')
))
)),
array('id'=> 2, 'name'=> 'Node #2', 'copii'=> array(
array('id'=> 5, 'name'=> 'Node #5', 'copii'=> array(
array('id'=> 6, 'name'=> 'Node #6',)
))
)),
);
// Prints out nodes 1,3,4 in order
$ra= array();
walk_array($complex_array, $ra, array(1, 3, 4));
print_r($ra);
// Prints out nodes 2,5,6 in order
$ra= array();
walk_array($complex_array, $ra, array(2, 5, 6));
print_r($ra);
// Prints out empty array
$ra= array();
walk_array($complex_array, $ra, array(5, 2, 4));
print_r($ra);
// Prints out nodes 2,5 in order
$ra= array();
walk_array($complex_array, $ra, array(2, 5));
print_r($ra);
?>