2013-10-08 20 views
0

我有一个数组,其中包含类名和它们的基类。结构看起来像这样:在PHP中基于类继承结构对数组进行排序

$list[0] = array("class"=>"ckEditor", "base"=>"domTextArea"); 
$list[1] = array("class"=>"ComboBox", "base"=>"Control"); 
$list[2] = array("class"=>"Control", "base"=>""); 
$list[3] = array("class"=>"domTextArea", "base"=>"Control"); 
.. 
... so on up to 50 classes 

问题是数组没有按继承结构排序。在这种情况下,Control类必须位于最前面。 PHP中是否有任何函数可以基于父子关系对此结构进行排序。得到的数组必须是这样的:

$list[0] = array("class"=>"Control", "base"=>""); 
$list[1] = array("class"=>"domTextArea", "base"=>"Control"); 
$list[2] = array("class"=>"ckEditor", "base"=>"domTextArea"); 
$list[3] = array("class"=>"ComboBox", "base"=>"Control"); 

编辑:这也将是有益的,如果任何人都可以提出一种算法来解决这类型的内在张力结构的。

+3

usort()帮助:-) – bwoebi

+0

你可以写一个自定义功能,默认功能将不知道该层次 –

回答

0

您可以使用递归函数。

$list[0] = array("class"=>"ckEditor", "base"=>"domTextArea"); 
$list[1] = array("class"=>"ComboBox", "base"=>"Control"); 
$list[2] = array("class"=>"Control", "base"=>""); 
$list[3] = array("class"=>"domTextArea", "base"=>"Control"); 

$parents = array(); 
foreach($list as $item) { 
    if (!is_array($parents[$item['base']])) { 
     $parents[$item['base']] = array(); 
    } 
    $parents[$item['base']][] = $item['class']; 
} 

function calculateChilds($base, $parents) { 
    $result = array(); 
    if (is_array($parents[$base])) { 
     foreach($parents[$base] as $child) { 
      $result[] = array('base' => $base, 'class' => $child); 
      $result = array_merge($result, calculateChilds($child, $parents)); 
     } 
    } 
    return $result; 
} 

var_dump(calculateChilds('', $parents)); 

Thils将输出如下:

array(4) { 
    [0]=> 
    array(2) { 
    ["base"]=> 
    string(0) "" 
    ["class"]=> 
    string(7) "Control" 
    } 
    [1]=> 
    array(2) { 
    ["base"]=> 
    string(7) "Control" 
    ["class"]=> 
    string(8) "ComboBox" 
    } 
    [2]=> 
    array(2) { 
    ["base"]=> 
    string(7) "Control" 
    ["class"]=> 
    string(11) "domTextArea" 
    } 
    [3]=> 
    array(2) { 
    ["base"]=> 
    string(11) "domTextArea" 
    ["class"]=> 
    string(8) "ckEditor" 
    } 
} 
+0

看起来不错,但哪有只是一个单一的函数,我通过列表并返回已排序的函数。 –

相关问题