2010-05-11 59 views
0

我有一個平面陣列,我試圖使多維。基本上,我想找到有父母的項目併爲該父母身份創建一個子數組。現在(這是簡化的),它看起來像這樣:基於關鍵值將平面php數組轉換爲多維數組?

Array 
(
    [0] => stdClass Object 
    (
    [id] => 1 
    [parent] => 0 
    [name ] => Parent1 
) 

    [1] => stdClass Object 
    (
    [id] => 7 
    [parent] => 1 
    [name] => Child1 
) 

    [2] => stdClass Object 
    (
    [id] => 9 
    [parent] => 1 
    [name] => Child2 
) 

    [3] => stdClass Object 
    (
    [id] => 2 
    [parent] => 0 
    [name ] => Parent2 
) 

    [4] => stdClass Object 
    (
    [id] => 88 
    [parent] => 2 
    [name] => Childof2 
) 
) 

我試圖使這個:

Array 
(
    [0] => stdClass Object 
    (
    [id] => 1 
    [parent] => 0 
    [name ] => Parent1 
    [children] => stdClass Object 
    (
     [1] => stdClass Object 
     (
     [id] => 7 
     [parent] => 1 
     [name] => Child1 
     ) 

     [2] => stdClass Object 
     (
      [id] => 9 
      [parent] => 1 
      [name] => Child2 
     ) 
    ) 
) 

    [1] => stdClass Object 
    (
    [id] => 2 
    [parent] => 0 
    [name ] => Parent2 
    [children] => stdClass Object 
    (
     [0] => stdClass Object 
     (
     [id] => 88 
     [parent] => 2 
     [name] => Childof2 
     ) 
    ) 
) 
) 

回答

0

骯髒和緩慢的方式使用遞歸是在這裏爲你。僞代碼:

$objects;// Your plain list. 
$root = (object) array('id' => 0); 

appendChildren($root, $objects); 

function appendChildren(&$node, $objects) 
{ 
    foreach($objects as $obj) 
    { 
     if($obj->parent == $node->id) 
     { 
      if(!isset($node->children)) 
       $node->children = array(); 

      $node->children[] = $obj; 
      appendChildren($obj, $objects); 
     } 
    } 
} 
0
<?php 

/** 
* This function should be efficient for large sets. 
* It loops a maximum of 3n times, each pass is cheap, 
* and it can work with multiple levels of children, 
* parents and grandparents. 
*/ 
function makeHierarchical($flatListOfObjects) { 
    // Create new reference list keyed on "id", 
    // assuming "id" is a positive integer. 
    $idList = array(); 
    foreach ($flatListOfObjects as $o) { 
    $idList[$o->id] = $o; 
    } 

    // Connect children with their parents, but don't remove 
    // them from top level yet, because they themselves might 
    // also be parents with children to be attached. 
    foreach ($idList as $o) { 
    if ($o->parent > 0) { 
     // Add as a child item to the children list of the parent. 
     $idList[$o->parent]->children[] = $o; 
    } 
    } 

    // Remove children from top level of the list. 
    foreach ($idList as $key => $o) { 
    if ($o->parent > 0) { 
     unset($idList[$key]); 
    } 
    } 

    // Return our newly created hierarchical list. 
    return $idList; 
} 

/** 
* Test Functions 
*/ 
function test_makeHierarchical() { 
    function makeObj($id, $name, $parent=0) { 
    $o = new stdClass(); 
    $o->id = $id; 
    $o->name = $name; 
    $o->parent = $parent; 
    return $o; 
    } 

    $flatList[] = makeObj(1, 'Parent1'); 
    $flatList[] = makeObj(7, 'Child1', 1); 
    $flatList[] = makeObj(9, 'Child2', 1); 
    $flatList[] = makeObj(2, 'Parent2'); 
    $flatList[] = makeObj(88, 'Childof2', 2); 

    print_r($flatList); 
    $newList = makeHierarchical($flatList); 
    print_r($newList); 
} 

test_makeHierarchical(); 

?>