2012-04-11 142 views
1

我有一个阵列的动态树阵列,让称之为$ childrenIds,其输出如下:创建从另一个阵列

array(

[74252] => Array 
    (
     [0] => 1753 
     [1] => 1757 
     [2] => 1758 
     [3] => 1760 
    ) 

[74238] => Array 
    (
     [0] => 1753 
     [1] => 1755 
     [2] => 1758 
     [3] => 1761 
    ) 

[76476] => Array 
    (
     [0] => 1754 
     [1] => 1755 
     [2] => 1758 
     [3] => 1763 
    ) 

[76478] => Array 
    (
     [0] => 1754 
     [1] => 1756 
     [2] => 1758 
     [3] => 1763 
    ) 

[76480] => Array 
    (
     [0] => 1754 
     [1] => 1757 
     [2] => 1758 
     [3] => 1763 
    ) 

[74253] => Array 
    (
     [0] => 1753 
     [1] => 1757 
     [2] => 1759 
     [3] => 1760 
    ) 

); 我需要做的是从中创建一个新的数组,例如, [74252]将被忽略,但 每个子阵列的孩子径处理...

所以用这个例子中我的输出会是这样的: 阵列(

[1753] => Array 
(
    [1757] => Array 
    (
     [1758] => Array 
     (
      1760 
     ), 
     [1759] => Array 
     (
      1760 
     ), 
    ) 
    [1755] => Array 
     (
      1758 => Array 
      (
       1761 
      ) 
     ) 
    ) 
), 
[1754] => Array 
(
    [1755] => Array 
    (
     [1758] => Array 
     (
      1763 
     ) 
    ), 
    [1756] => Array 
    (
     [1758] => Array 
     (
      1763 
     ) 
    ), 
    [1757] => Array 
    (
     [1758] => Array 
     (
      1763 
     ) 
    ) 
) 
); 

所以不会总是4个子阵列元件,即动态...

父母只是基于该阵列的索引。所以...索引[0]是指数的父[1],索引[1]是index [2]的父母等等。

另外,I想要结束所有的UNIQUE路径,每个路径没有重复的值。

希望我已经清楚地解释了这一点,一直在寻找几个小时,找不到满足我所有要求的解决方案,如果我忽略了一个,我提前道歉。

由于

UPDATE

与之相对传递一个数组我结束了通过下划线分隔的字符串,然后使用此功能:

function explodeTree($array, $delim = '/') 
{ 
$tree = array(); 

foreach($array as $elem) 
{ 
    // Split our string up, and remove any blank items 
    $items = explode($delim, $elem); 
    $items = array_diff($items, array('')); 

    // current holds the current position in the tree 
    $current = &$tree; 

    foreach($items as $item) 
    { 
     // If we've not created this branch before, or there is 
     // a leaf with the same name, then turn it into a branch 
     if(!isset($current[$item]) || !is_array($current[$item])) 
     { 
      $current[$item] = array(); 
     } 

     // Update our current position to the branch we entered 
     // (or created, depending on the above if statement) 
     $current = &$current[$item]; 
    } 

    // If the last value in this row is an array with 0 elements 
    // then (for now) we will consider it a leaf node, and set it 
    // to be equal to the string representation that got us here. 
    if(count($current) == 0) 
    { 
     $current = $elem; 
    } 
} 

return $tree; 
} 

发现@: http://project-2501.net/index.php/2007/10/explodetree/
AND: http://kevin.vanzonneveld.net/techblog/article/convert_anything_to_tree_structures_in_php/

我能够获得所需的结果。

+0

如何是每个项目“径处理”的孩子呢?逻辑是什么?为什么 - 在最终阵列中 - 1753年有1755年和1757年的孩子? (而不是别的) – 2012-04-11 03:44:29

+0

对不起......父母只是基于该数组的索引。所以... index [0]是索引[1]的父亲,索引[1]是索引[2]的父亲,等等。 – Jim 2012-04-11 03:46:45

+0

所以你需要'(1753-> 1757-> 1758-> 1760,1754-> 1755-> 1758-> 1763,...)''?小心点,以便我们谈论的是同样的事情...... – 2012-04-11 03:48:50

回答

1

对于数组中的第一个元素:

[74252] => Array 
    (
     [0] => 1753 
     [1] => 1757 
     [2] => 1758 
     [3] => 1760 
    ) 

表示的路径是基本上

[0] => 1753 
[1] => 1753/1757 
[2] => 1753/1757/1758 
[3] => 1753/1757/1758/1760 

你可以可能与这样的(未测试)解决。 explodeTree函数是从http://kevin.vanzonneveld.net/techblog/article/convert_anything_to_tree_structures_in_php/,我假设它的工作原理与广告一样。从来没有使用过它。

$pathArray = array(); 
foreach($startArray as $subArray) { 
    $pathStr = ''; 

    foreach($subArray as $v) { 
     $pathStr = $pathStr.'/'.$v; 
     $pathArray[]=$pathStr; 
    }   
} 

$pathArray = array_unique($pathArray); 
$treeArray = explodeTree($pathArray, "/"); 
+0

你设置了我的正确路径...我通过谷歌在这里找到了一个解决方案... http://project-2501.net/index.php/2007/10/ explodetree /,非常感谢。 – Jim 2012-04-11 04:49:03

0

代码:(修订版)

$newarr = array(); 

function getElem($sub,$n) 
{ 
    $res = array(); 

    if ($n==count($sub)-1) 
     $res[]=$sub[$n]; 
    else 
     $res[$sub[$n]] = getElem($sub,$n+1); 

    return $res; 
} 

foreach ($arr as $subarr) 
{ 
    $newarr[$subarr[0]] = getElem($subarr,1); 
} 

print_r($newarr); 

输入:

$arr= 
array(

74252 => Array 
    (
     0 => 1753, 
     1 => 1757, 
     2 => 1758, 
     3 => 1760 
    ), 

74238 => Array 
    (
     0 => 1753, 
     1 => 1755, 
     2 => 1758, 
     3 => 1761 
    ), 

76476 => Array 
    (
     0 => 1754, 
     1 => 1755, 
     2 => 1758, 
     3 => 1763 
    ), 

76478 => Array 
    (
     0 => 1754, 
     1 => 1756, 
     2 => 1758, 
     3 => 1763 
    ) 
); 

输出:

Array 
(
    [1753] => Array 
     (
      [1755] => Array 
       (
        [1758] => Array 
         (
          [0] => 1761 
         ) 

       ) 

     ) 

    [1754] => Array 
     (
      [1756] => Array 
       (
        [1758] => Array 
         (
          [0] => 1763 
         ) 

       ) 

     ) 

) 
+0

那么这就是所需的输出!然而,我的主阵列中有5个元素与我分享的内容不同,子元素的数量也会有所不同。我欣赏尽管。 – Jim 2012-04-11 04:10:20

+0

@Jim给我一下,我也会让它处理可变的子元素。 – 2012-04-11 04:11:19

+0

@Jim我刚刚更新了我的答案......它现在可以用于主阵列中的任何元素,以及任何数量的子元素... :-) – 2012-04-11 04:20:04