Для одного возможного решения см. Мое второе сообщение ниже.Лучший способ генерации текстовых паттернов из массива PHP, имеющих 3 столбца (id, путь, имя)?
Имея PHP массив хранения данных из древовидной структуры, с
- первой колонкой хранением идентификатора узла,
- второго столбца хранением пути родительского узла в виде конкатенации значения идентификаторов,
- третьих столбцов хранящих имя узла,
, который является лучшим способом для генерации текста пути (хлебные крошки) от пути выполненного из Идентификаторы?
Пример записей:
id | path | name
---------------------
1 | 0 | edible
14 | 1 | fruits
53 | 1.14 | apples
54 | 1.14 | pears
122 | 1.14.53 | red apples
123 | 1.14.53 | green apples
124 | 1.14.54 | yellow pears
Входной ID: 122
Соответствующий входной тракт: 1.14.53
Выходная строка: edible > fruits > apples
Идея заключается в том, чтобы достичь что-то вроде:
foreach($cats as $cat) { // for each category
foreach(explode('.', $cat['path']) as $id) { // explode the path into chunks
/*
1) get the name matching the value of $id
2) append label to breadcrumbs string
*/
}
// 3) output breadcrumbs for the given category
// [4) list leaf nodes under the breadcrumbs for the current category]
}
нотабене: Сам массив генерируется этим MySQL/MariaDB запрос:
$req = "SELECT c.id,p.path,c.name FROM `".$database['database']."`.`".$database['prefix']."productcategories` c
LEFT OUTER JOIN `".$database['database']."`.`".$database['prefix']."prodcat_path` p
ON c.id = p.id
WHERE c.isparent AND (c.id=".$id." OR (p.path=".$id." OR p.path LIKE('".$id.".%') OR p.path LIKE('%.".$id.".%') OR p.path LIKE('%.".$id."'))) ORDER BY p.path ASC";
$res = mysql_query($req) or die();
Причины для хранения пути в отдельную таблицу, с отношением один к одному для что триггер используется для вычисления и сохранения пути при вставке новой категории.
Улучшен запрос MySQL. Предложение WHERE должно выбрать данный узел ($ id) и все его дочерние объекты, за исключением листьев. Кажется, работает. – OuzoPower
Я разместил решение, которое я нашел в сообщении ниже. Это отчасти работает. Существует только одна проблема с запросом на выбор узлов-предков, который в настоящее время является неправильным. – OuzoPower
Решена проблема получения узлов-предков; см. мой пост ниже. – OuzoPower