2012-04-23 205 views
2

我试图安排一组页面到一个数组中,并根据它们的父ID号来放置它们。如果父ID为0,我想它被放置在阵列作为这样一个数组中......数组键存在于多维数组

$get_pages = 'DATABASE QUERY' 
$sorted = array() 

foreach($get_pages as $k => $obj) { 
    if(!$obj->parent_id) { 
     $sorted[$obj->parent_id] = array(); 
    } 
} 

但是,如果父ID设为我想将它放置到相关阵列,再次像这样的阵列...

$get_pages = 'DATABASE QUERY' 
$sorted = array() 

foreach($get_pages as $k => $obj) { 
    if(!$obj->parent_id) { 
     $sorted[$obj->id] = array(); 
    } else if($obj->parent_id) { 
     $sorted[$obj->parent_id][$obj->id] = array(); 
    } 
} 

这是我开始有一个问题。如果我有第三个元素需要插入数组的第二个维度,或者甚至需要在第三个维度插入第四个元素,我无法检查该数组键是否存在。所以我想不出的是如何检测数组键是否存在于第一维之后,如果它确实存在,那么我可以放置新元素。

这里是我的数据库表

id page_name parent_id 

1  Products    0 
2  Chairs    1 
3  Tables    1 
4  Green Chairs   2 
5  Large Green Chair 4 
6  About Us    0 

的例子这里是我想要得到的,如果有更好的方法来做到这一点我很开放的建议输出的一个例子。

Array([1]=>Array([2] => Array([4] => Array([5] => Array())), [3] => Array()), 6 => Array()) 

谢谢先进!

回答

2

嗯,基本上是你正在建设一个树所以去的方式之一是recursion

// This function takes an array for a certain level and inserts all of the 
// child nodes into it (then going to build each child node as a parent for 
// its respective children): 

function addChildren(&$get_pages, &$parentArr, $parentId = 0) 
{ 
    foreach ($get_pages as $page) 
    { 
     // Is the current node a child of the parent we are currently populating? 

     if ($page->parent_id == $parentId) 
     { 
      // Is there an array for the current parent? 

      if (!isset($parentArr[ $page->id ])) 
      { 
       // Nop, create one so the current parent's children can 
       // be inserted into it. 

       $parentArr[ $page->id ] = array(); 
      } 

      // Call the function from within itself to populate the next level 
      // in the array: 

      addChildren($get_pages, $parentArr[ $page->id ], $page->id); 
     } 
    } 
} 


$result = array(); 
addChildren($get_pages, $result); 

print_r($result); 

这是不是要走,但对于少数的网页&层次,你应该最有效的方法没事的。

+0

谢谢!我会试一试。我怎样才能让它更有效率? – PapaSmurf 2012-04-23 11:05:50

+0

像魅力一样工作,谢谢!尽管如此,我不得不将'!is_array'更改为'isset'。 – PapaSmurf 2012-04-23 11:42:22

+0

是啊... isset是正确的,因为索引可能根本不存在... – Yaniro 2012-04-23 11:44:10