2010-11-18 113 views
0

如何重新排列如下数组PHP重新排序数组以反映父/ ID层次

[0] => Array 
    (
     [id] => 1 
     [parent_id] => 0 
     [name] => Accueil 
    ) 

[1] => Array 
    (
     [id] => 2 
     [parent_id] => 0 
     [name] => Exposants 
    ) 

[2] => Array 
    (
     [id] => 3 
     [parent_id] => 0 
     [name] => Visiteurs 
    ) 

[3] => Array 
    (
     [id] => 4 
     [parent_id] => 0 
     [name] => Medias 
    ) 

[4] => Array 
    (
     [id] => 5 
     [parent_id] => 0 
     [name] => Activités 
    ) 

[5] => Array 
    (
     [id] => 6 
     [parent_id] => 1 
     [name] => Contact 
    ) 

[6] => Array 
    (
     [id] => 7 
     [parent_id] => 3 
     [name] => Partenaires 
    ) 

[7] => Array 
    (
     [id] => 8 
     [parent_id] => 2 
     [name] => News 
    ) 

于是我想出了一个反映层次结构如图中的ID和PARENT_ID领域的阵列?数组键是数组元素的ID字段是父项。在这个数组里面每次都是一个以ID字段为关键字的子数组。示例:

[1] => Array 
     (
      [name] => Accueil 
      [children] => array(
       [0] => bla, 
       [3]  => bla2 
      ) 
     ) 

    [2] => Array 
     (
      [name] => Something 
      [children] => array(
       [4] => bla3, 
      ) 
     ) 
+0

如果你在主数组中有所有的“人员”,将这些ID单独存储在“子”键下而不是将其作为键/值存储是不明智的(假设该值是名称或某些)? – Orbling 2010-11-18 16:12:29

回答

0

您可以使这更干,但它是一种快速和肮脏的方式来处理它。此外,如果可以保证每个子记录具有有效的父记录,并且有效的父记录在原始数组中的子记录之前,则可以删除6行。

$sorted = array(); 
foreach($orig_ary as $item) { 
    if ($item['parent_id'] === 0) { 
    if (!array_key_exists($item['id'], $sorted)) { 
     $sorted[ $item['id'] ] = array(
     'name' => '', 
     'children' => array() 
    ); 
    } 
    $sorted[ $item['id'] ]['name'] = $item['name']; 
    } else { 
    if (!array_key_exists($item['parent_id'], $sorted)) { 
     $sorted[ $item['parent_id'] ] = array(
     'name' => '', 
     'children' => array() 
    ); 
    } 
    $sorted[ $item['parent_id'] ]['children'][ $item['id'] ] = $item['name']; 
    } 
} 
2

适用于任何深度,让孩子先于父母:

<?php 
$p = array(0 => array()); 
foreach($nodes as $n) 
{ 
    $pid = $n['parent_id']; 
    $id = $n['id']; 

    if (!isset($p[$pid])) 
    $p[$pid] = array('child' => array()); 

    if (isset($p[$id])) 
    $child = &$p[$id]['child']; 
    else 
    $child = array(); 

    $p[$id] = $n; 
    $p[$id]['child'] = &$child; 
    unset($p[$id]['parent_id']); 
    unset($child); 

    $p[$pid]['child'][] = &$p[$id];  
} 
$nodes = $p['0']['child']; 
unset($p); 
?> 

$nodes结果使用var_dump看结构。它接近你的建议。主要区别在于键不是ID。