Родительский дочерний массив PHP 2d ⇐ Php
-
Anonymous
Родительский дочерний массив PHP 2d
Да, да, я знаю, здесь много вопросов о сортировке массивов, но мне нужно еще одно конкретное объяснение.
У меня есть таблица БД для хранения многоуровневого меню с продуктами.
Например: itemId, ParentId, itemtitle, ...
Я использую эту таблицу для построения меню на веб-странице, используя рекурсивную функцию, и я хочу использовать эту таблицу БД для получения данных для Внутренняя html-форма для списка опций.
Несортированные данные из БД мне нужно правильно отсортировать и поместить в массив json.
Половину работы я проделал с этим:
//empty arrays for sorting purposes
$ids = array();
$parents = array();
// iterate, $items - unsorted array from DB
foreach ($items as $key => $row) {
$ids[$key] = $row['itemId'];
$parents[$key] = $row['parentId'];
}
// sorting
array_multisort($ids, SORT_ASC, $parents, SORT_ASC, $items);
//now $items partly sorted
РИС.1
Итак, список $items выглядит следующим образом:
(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
РИС.2
Мне нужно:
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
Итак, вопрос в том, как аккуратно преобразовать массив из Фиг.1 в массив из Фиг.2?
Итак, это мое решение. Только двухуровневое меню:
//get all categories, primary sorted by MySQL
$items = $cataloAR->query("SELECT itemId, parentId,itemTitle FROM `catalog` ORDER BY parentId, itemId");
//pre-sort by - itemId, parentId
$ids = array();//array for id`s
$parents = array();//array for parents
// get columns list
foreach ($items as $key => $row) {
$ids[$key] = $row['itemId'];
$parents[$key] = $row['parentId'];
}
// sort ascending by id, ascending by parent
array_multisort($ids, SORT_ASC, $parents, SORT_ASC, $items);
//make emptyarray for sorteddata, like - $entryList['itemId']['itemTitle']
$entryList = array();//empty array
$len = count($items); //count elements for proceeding
$currentEntry = 0; //current element number,start from 0-element
//iterate
//while reaching last element in list
while($currentEntry < $len){
//if current element is empty => go to next element
if (!isset($items[$currentEntry])) {
$currentEntry++;
}
//get current element from $items
//put it to $entryList
$entryList[] = $items[$currentEntry];
// get current id
$currentId = $items[$currentEntry]['itemId'];
//remove element from $items, because we just put it to the sorted list
unset($items[$currentEntry]);
//search in $items entries with patternId = $items['itemId']
//put to sorted list
//remove element
foreach ($items as $key => $value) {
if($value['parentId'] == $currentId){
$entryList[] = $value;
unset($items[$key]);
}
if (!isset($value)){
continue;
}
}
//increase counter
$currentEntry++;
}
//purge sorted list from empty elements $entryList
$sortedList = array_filter($entryList);
//Enjoy it!
return $sortedList;
Подробнее здесь: https://stackoverflow.com/questions/305 ... rent-child
Да, да, я знаю, здесь много вопросов о сортировке массивов, но мне нужно еще одно конкретное объяснение.
У меня есть таблица БД для хранения многоуровневого меню с продуктами.
Например: itemId, ParentId, itemtitle, ...
Я использую эту таблицу для построения меню на веб-странице, используя рекурсивную функцию, и я хочу использовать эту таблицу БД для получения данных для Внутренняя html-форма для списка опций.
Несортированные данные из БД мне нужно правильно отсортировать и поместить в массив json.
Половину работы я проделал с этим:
//empty arrays for sorting purposes
$ids = array();
$parents = array();
// iterate, $items - unsorted array from DB
foreach ($items as $key => $row) {
$ids[$key] = $row['itemId'];
$parents[$key] = $row['parentId'];
}
// sorting
array_multisort($ids, SORT_ASC, $parents, SORT_ASC, $items);
//now $items partly sorted
РИС.1
Итак, список $items выглядит следующим образом:
(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
РИС.2
Мне нужно:
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
Итак, вопрос в том, как аккуратно преобразовать массив из Фиг.1 в массив из Фиг.2?
Итак, это мое решение. Только двухуровневое меню:
//get all categories, primary sorted by MySQL
$items = $cataloAR->query("SELECT itemId, parentId,itemTitle FROM `catalog` ORDER BY parentId, itemId");
//pre-sort by - itemId, parentId
$ids = array();//array for id`s
$parents = array();//array for parents
// get columns list
foreach ($items as $key => $row) {
$ids[$key] = $row['itemId'];
$parents[$key] = $row['parentId'];
}
// sort ascending by id, ascending by parent
array_multisort($ids, SORT_ASC, $parents, SORT_ASC, $items);
//make emptyarray for sorteddata, like - $entryList['itemId']['itemTitle']
$entryList = array();//empty array
$len = count($items); //count elements for proceeding
$currentEntry = 0; //current element number,start from 0-element
//iterate
//while reaching last element in list
while($currentEntry < $len){
//if current element is empty => go to next element
if (!isset($items[$currentEntry])) {
$currentEntry++;
}
//get current element from $items
//put it to $entryList
$entryList[] = $items[$currentEntry];
// get current id
$currentId = $items[$currentEntry]['itemId'];
//remove element from $items, because we just put it to the sorted list
unset($items[$currentEntry]);
//search in $items entries with patternId = $items['itemId']
//put to sorted list
//remove element
foreach ($items as $key => $value) {
if($value['parentId'] == $currentId){
$entryList[] = $value;
unset($items[$key]);
}
if (!isset($value)){
continue;
}
}
//increase counter
$currentEntry++;
}
//purge sorted list from empty elements $entryList
$sortedList = array_filter($entryList);
//Enjoy it!
return $sortedList;
Подробнее здесь: https://stackoverflow.com/questions/305 ... rent-child
Мобильная версия