2013-10-08 1 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 

Проблема в том, что массив не сортируется в терминах структуры наследования. В этом случае класс управления должен быть сверху. Есть ли какая-либо функция в 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"); 

EDIT: Это также будет полезно, если кто-то может предложить алгоритм сортировки такого типа sturcture.

+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

выглядит хорошо, но может быть там просто одна функция, в которой я передаю список, и возвращает отсортированную. –

Смежные вопросы