2013-05-01 2 views
0

У меня есть массив категорий, который выглядит как-тоПостроить иерархический список из массива

array(
    array(
    'id' => '1', 
    'path' => '1', 
    'children_count' => '16', 
    'name' => 'A' 
), 
    array(
    'id' => '3', 
    'path' => '1/2/3', 
    'children_count' => '0', 
    'name' => 'C' 
), 
    array(
    'id' => '2', 
    'path' => '1/2', 
    'children_count' => '9', 
    'name' => 'B' 
), 
    array(
    'id' => '4', 
    'path' => '1/2/4', 
    'children_count' => '0', 
    'name' => 'D' 
) 
) 

То, что я пытаюсь построить это иерархический массив (ключ path показывает соотношение основанного на id), поэтому вывод находится в правильном порядке (сначала родитель корня, потом дети, потом больше детей) и отступ name, основанный на том, как далеко внизу находится ребенок. Конечный результат должен выглядеть примерно так:

A 
-B 
--C 
--D 

Вот что я до сих пор, но это, очевидно, не работает

$categoryTree = array(); 

foreach ($categories as $category) { 

    $categoryTree[(string)$category['path']] = str_repeat("-", substr_count($category['path'], "/")) . $category['name']; 
} 

ksort($categoryTree); 

var_export($categoryTree); 

который выходит на:

array (
    '1/2' => '-B', 
    '1/2/3' => '--C', 
    '1/2/4' => '--D', 
    1 => 'A' 
) 

Как я могу получить они в правильном порядке? (и если братьев и сестер можно было бы заказать по id, которые также были бы денди)

ответ

1

Это основано на ответе One Trick Pony, но правильно обрабатывает идентификаторы с более чем одной цифрой.

foreach ($categories as $category) 
    $output[$category['path']] = 
    str_repeat('-', substr_count($category['path'], '/')) . $category['name']; 

$paths = array_keys($output); 
natsort($paths); 

foreach ($paths as $path) { 
    echo $output[$path], "\n"; 
} 
1

Подсчитайте количество косых черт для создания префиксов значений, затем отсортируйте по пути (клавише)?

foreach ($categories as $category) 
    $output[$category['path']] = 
    str_repeat('-', substr_count($category['path'], '/')) . $category['name']; 

ksort($output, SORT_STRING); 
+0

Включите эту группу в одну и ту же часть иерархии? Например. если у вас 1/2, 1/5, 1/2/3, 1/2/4, 1/5/6, 1/5/7. – Barmar

+0

Да, разве это не предполагаемый выход? (1/2, 1/2/3, 1/2/4, 1/5 ...) –

+0

Извините, неправильно прочитайте, что вы сортировали. – Barmar

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