2010-06-08 3 views
3

Я попытался сделать функцию, которая выполняет итерацию через следующий массив, чтобы сгладить его и добавить родительский идентификатор к детям, где это применимо. Я просто не могу заставить его работать, так что я надеюсь, что кто-то здесь имеет представление о том, что делать:PHP: Модифицирование массива рекурсивно?

Вот отправную точку:

Array 
(
    [0] => Array (
      [id] => 1 
      [children] => array (
       [id] => 2 
       [children] => Array (
        [0] => Array (
          [id] => 3 
        ) 
      ) 
     ) 
) 

Ожидаемый результат:

Array (

    [0] => array ( 
     [id] => 1 
    ) 

    [1] => array ( 
     [id] => 2 
    ) 

    [2] => array ( 
     [id] => 3, 
     [parent] => 2 
    ) 

) 

Надеюсь, что каждый может указать мне в правильном направлении. Большое спасибо!

Решение (Спасибо Оли!):

$output = array(); 

     function dejigg($in) { 
      global $output; 

      if (!isset($in['children'])) { 
       $in['children'] = array(); 
      } 
      $kids = $in['children'] or array(); 
      unset($in['children']); 
      if (!isset($in['parent'])) { 
       $in['parent'] = 0; // Not neccessary but makes the top node's parent 0. 
      } 
      $output[] = $in; 

      foreach ($kids as $child) { 
       $child['parent'] = $in['id']; 
       dejigg($child); // recurse 
      } 

      return $output; 
     } 

     foreach ($array as $parent) { 
      $output[] = dejigg($parent); 
     } 

     $array = $output; 
     print("<pre>".print_r($array,true)."</pre>"); 
+0

Вы хотите третий элемент ожидаемого результата быть 2, а не 3, правильно? Просто опечатка? – animuson

+0

Привет! Correctomundo. Благодаря! – Industrial

ответ

4

Я проверил это на этот раз. Это работает!

$input = array(array('id' => 1, 'children'=>array(array('id'=>2, 'children'=>array(array('id'=>3))))) ); 
$output = []; 

function dejigg($in) { 
    global $output; 

    $kids = $in['children'] or array(); 
    unset($in['children']); 
    $output[] = $in; 

    foreach ($kids as $child) { 
     $child['parent'] = $in['id']; 
     dejigg($child); // recurse 
    } 
} 

foreach ($input as $parent) 
    dejigg($parent); 

print_r($output); 

И возвращается:

Array 
(
    [0] => Array 
     (
      [id] => 1 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [parent] => 1 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [parent] => 2 
     ) 

) 
+0

Привет, Оли! Большое спасибо за вашу помощь! К сожалению, он возвращает только пустой массив :( Вы знаете почему? – Industrial

+1

'$ in> children'?' $ In> parent'? – webbiedave

+1

Опять же, забыли, на каком языке и объекте я имел дело. Попробуйте это. – Oli

Смежные вопросы