Php сортировка массива родитель-потомок?

Привет
В БД хранится многоуровневое меню с продукцией, в таблице вида:
(itemId, parentId, itemtitle, ...)
По этой таблице строится меню, с помощью рекурсивной функции, упорядочено и вложено (ul-li)
По ней же нужно построить html select для формы в админке.
Данные из БД приходят неупорядоченно, с помощью array_multisort их удается отсортировать по возрастанию по itemId и parentId к виду:
(itemId - parentId - itemTitle)
1 - 0 - ***A
2 - 0 - ***B
3 - 0 - ***C
4 - 0 - ***D
6 - 1 - ***E
7 - 1 - ***F
8 - 1 - ***G
9 - 2 - ***H
10 - 2 - ***I
11 - 2 - ***J
12 - 2 - ***K
13 - 2 - ***L
14 - 3 - ***M
15 - 3 - ***N
16 - 3 - ***O
17 - 4 - ***P
18 - 4 - ***Q

мне, для передачи в json и тд. необходимо отсортировать к виду:
1 - 0 - ***A
6 - 1 - ***E
7 - 1 - ***F
8 - 1 - ***G
2 - 0 - ***B
9 - 2 - ***H
10 - 2 - ***I
11 - 2 - ***J
12 - 2 - ***K
13 - 2 - ***L
3 - 0 - ***C
14 - 3 - ***M
15 - 3 - ***N
16 - 3 - ***O
4 - 0 - ***D
17 - 4 - ***P
18 - 4 - ***Q

Соотвественно в этом и вопрос, как?
  • Вопрос задан
  • 883 просмотра
Решения вопроса 1
@aornos Автор вопроса
Собственно решение. На оригинальность не претендую, работает только для двухуровневого меню:
//получаем список категорий из каталога
    $items = $cataloAR->query("SELECT itemId, parentId,itemTitle FROM `catalog` ORDER BY parentId, itemId"); 
//сортируем предварительно по itemId, parentId
    $ids = array();//массив для идентификаторов
    $parents = array();//массив для родителей
// получаем список столбцов
    foreach ($items as $key => $row) {
        $ids[$key]  = $row['itemId'];
        $parents[$key] = $row['parentId'];
    }
// сортируем по возрастанию id, по возрастанию parent
    array_multisort($ids, SORT_ASC, $parents, SORT_ASC, $items);
//Создаем пустой массив для отсортированных данных типа - $entryList['itemId']['itemTitle'] 
    $entryList = array();//пустой массив
    $len = count($items); //получаем общее кол-во элементов для обработки
    $currentEntry = 0;  //номер текущего элемента
//итерируем
//пока не достигли последнего элемента в списке
   while($currentEntry < $len){        
//если нет текущего эл-то то переходим к следующему
        if (!isset($items[$currentEntry])) {
            $currentEntry++;
        } 
 //берем текущий эл-т из $items
//кладем его в $entryList
        $entryList[] = $items[$currentEntry];    
// запоминаем текущий  id 
        $currentId = $items[$currentEntry]['itemId'];        
//убираем эл-т из  $items, тк мы его уже положили в отсортированный список
        unset($items[$currentEntry]);     
//Ищем в $items записи с  patternId = $items['itemId']  
//ищем где  такой-же родитель, кладем в отсортированный список
//удаляем эл-т который забрали 
        foreach ($items as $key => $value) {
            if($value['parentId'] == $currentId){
                $entryList[] = $value;               
                unset($items[$key]);                  
            } 
            if (!isset($value)){
                continue;
            }
            
        } 
//увеличиваем счетчик               
            $currentEntry++;                   
    }    
//очищаем отсортированный массив от пустых эл-тов $entryList
    $sortedList = array_filter($entryList);
 //Enjoy it!
    return $sortedList;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
He11ion
@He11ion
PHP-monkey
php.net/manual/ru/function.usort.php и внутри функции уже сравниваете что хотите
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект