Выборка родительских элементов в древовидном массиве
Создавать многомерный массив из одномерного массива с указателями на родительские элементы мы уже умеем. Но может возникнуть другая задача: зная ID элемента, надо получить все его родительские элементы, причем уровень вложенности может быть абсолютно любым. Пример из практики. В базе хранится список стран и регионов, перелинкованный через указатели на родительские элементы. Если его развернуть в многомерный массив, то получится примерно следующее:Code (PHP) : Убрать нумерацию
- $regions=array(
- 1=>array(
- 'name'=>'Россия',
- 'parent'=>0,
- 'child'=>array(
- 2=>array(
- 'name'=>'Москва и Московская область',
- 'parent'=>1,
- 'child'=>array(
- 3=>array(
- 'name'=>'Москва',
- 'parent'=>2,
- 'child'=>array(
- ),
- ),
- 5=>array(
- 'name'=>'Московская область',
- 'parent'=>2,
- 'child'=>array(
- 6=>array(
- 'name'=>'Дмитровский район',
- 'parent'=>6,
- 'child'=>array(
- 7=>array(
- 'name'=>'Дмитров',
- 'parent'=>6,
- 'child'=>array(),
- ),
- 9=>array(
- 'name'=>'Яхрома',
- 'parent'=>6,
- 'child'=>array(),
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- 4=>array(
- 'name'=>'Пермский край',
- 'parent'=>1,
- 'child'=>array(
- 8=>array(
- 'name'=>'Пермь',
- 'parent'=>4,
- 'child'=>array(),
- ),
- 10=>array(
- 'name'=>'Соликамск',
- 'parent'=>4,
- 'child'=>array(),
- ),
- 11=>array(
- 'name'=>'Кунгур',
- 'parent'=>4,
- 'child'=>array(),
- ),
- ),
- ),
- ),
- ),
- );
Это можно сделать при помощи вот такой рекурсивной функции:
Code (PHP) : Убрать нумерацию
- //--------------------------------------------------------------
- // Получение всех родительских элементов массива
- //--------------------------------------------------------------
- function get_parents($data, $search_id, &$parents) {
- foreach ($data as $id=>$item) {
- if (get_parents($item['child'], $search_id, $parents)) {
- array_unshift($parents, array(
- 'id'=>$id,
- 'name'=>$item['name'],
- ));
- return true;
- }
- if ($id==$search_id) {
- return true;
- }
- }
- return false;
- }
Code (PHP) : Убрать нумерацию
- // Яхрома
- $parents=array();
- get_parents($regions, 9, $parents);
Array (
[0] => Array (
[id] => 1
[name] => Россия
)
[1] => Array (
[id] => 2
[name] => Москва и Московская область
)
[2] => Array (
[id] => 5
[name] => Московская область
)
[3] => Array (
[id] => 6
[name] => Дмитровский район
)
)
Code (PHP) : Убрать нумерацию
- // Соликамск
- $parents=array();
- get_parents($regions, 10, $parents);
Array (
[0] => Array (
[id] => 1
[name] => Россия
)
[1] => Array (
[id] => 4
[name] => Пермский край
)
)
Просмотров: 2075 | Комментариев: 2
Метки: PHP, полезные функции
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(21.08.2017 в 11:35):
Свое, для внутреннего использования. Глобальная детализация и всеобъемлющий охват пока не нужны.
Alkov
(21.08.2017 в 10:28):
КЛАДР или ФИАС ?
Добавить комментарий
Заполните форму для добавления комментария