Родительский дочерний массив PHP 2dPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Родительский дочерний массив PHP 2d

Сообщение Anonymous »



Да, да, я знаю, здесь много вопросов о сортировке массивов, но мне нужно еще одно конкретное объяснение.

У меня есть таблица БД для хранения многоуровневого меню с продуктами.

Например: 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»