2012-09-19 23 views
0

我有一個有序數組,因此每個ref鍵都保證存在於同一個數組中的前幾個元素中。但是,引用可能位於前一個元素的另一個數組內。所以我使用遞歸函數來找到合適的位置,但由於某種原因,我無法刪除前一個元素。PHP:通過循環和函數移動(不復制)數組元素之間的引用數組

我能做些什麼:到屬於他們的地方
複製必需的元素我可以信息:
移動跨陣列

這些元素這裏有原始數組的僞輸出。

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [ref] => 
      [arr] => Array() 
     ) 
    [1] => Array 
     (
      [id] => 2 
      [ref] => 1 
      [arr] => Array() 
     ) 
    [2] => Array 
     (
      [id] => 3 
      [ref] => 1 
      [arr] => Array() 
     ) 
    [3] => Array 
     (
      [id] => 4 
      [ref] => 3 
      [arr] => Array() 

     ) 
) 

這是我的代碼。

$myArr = array(/* above elements gathered from the DB */); 
foreach ($myArr as &$arr) { 
    if (!is_null($arr['ref'])) relocate($arr, $arr['ref']); 
} 
unset($arr); 

function relocate(&$node, $id, &$arr=NULL) { 
    global $myArr; 
    if (is_null($arr)) $arr = &$myArr; 
    foreach ($arr as &$arr1) { 
     if ($arr1['id'] == $id) { 
      array_push($arr1['arr'], &$node); 
      return; 
     } 
    } 
    unset($arr1); // not sure if this is necessary 
    if (!empty($arr['arr'])) relocate(&$node, $id, &$arr['arr']); 
} 

和所需的輸出:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [ref] => 
      [arr] => Array 
       (
        [0] => Array 
         (
          [id] => 2 
          [ref] => 1 
          [arr] => Array() 
         ) 
        [1] => Array 
         (
          [id] => 3 
          [ref] => 1 
          [arr] => Array 
           (
            [0] => Array 
             (
              [id] => 4 
              [ref] => 3 
              [arr] => Array() 
             ) 
           ) 
         ) 
       ) 
     ) 
) 

我缺少什麼?

回答

0

我認爲,參考文獻是一種想象的方法。我結束了使用下面的代碼。

$myArr = array(/* elements gathered from the DB */); 
foreach ($myArr as $arr) { 
    if (!is_null($arr['ref'])) { 
     relocate($arr, $arr['ref']); 
     unset($myArr[array_search($arr,$myArr)]); 
    } 
} 

function relocate($node, $id, &$arr=NULL) { 
    global $myArr; 
    if (is_null($arr)) $arr = &$myArr; 
    foreach ($arr as &$arr1) { 
     if ($arr1['id'] == $id) { 
      return array_push($arr1['arr'], $node); 
     } 
     if (!empty($arr1['arr'])) relocate($node, $id, &$arr1['arr']); 
    } 
}