Blog. Just Blog

Выборка родительских элементов в древовидном массиве

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Создавать многомерный массив из одномерного массива с указателями на родительские элементы мы уже умеем. Но может возникнуть другая задача: зная ID элемента, надо получить все его родительские элементы, причем уровень вложенности может быть абсолютно любым. Пример из практики. В базе хранится список стран и регионов, перелинкованный через указатели на родительские элементы. Если его развернуть в многомерный массив, то получится примерно следующее:
  1. $regions=array(
  2.     1=>array(
  3.         'name'=>'Россия',
  4.         'parent'=>0,
  5.         'child'=>array(
  6.             2=>array(
  7.                 'name'=>'Москва и Московская область',
  8.                 'parent'=>1,
  9.                 'child'=>array(
  10.                     3=>array(
  11.                         'name'=>'Москва',
  12.                         'parent'=>2,
  13.                         'child'=>array(
  14.                         ),
  15.                     ),
  16.                     5=>array(
  17.                         'name'=>'Московская область',
  18.                         'parent'=>2,
  19.                         'child'=>array(
  20.                             6=>array(
  21.                                 'name'=>'Дмитровский район',
  22.                                 'parent'=>6,
  23.                                 'child'=>array(
  24.                                     7=>array(
  25.                                         'name'=>'Дмитров',
  26.                                         'parent'=>6,
  27.                                         'child'=>array(),
  28.                                     ),
  29.                                     9=>array(
  30.                                         'name'=>'Яхрома',
  31.                                         'parent'=>6,
  32.                                         'child'=>array(),
  33.                                     ),
  34.                                 ),
  35.                             ),
  36.                         ),
  37.                     ),
  38.                 ),
  39.             ),
  40.             4=>array(
  41.                 'name'=>'Пермский край',
  42.                 'parent'=>1,
  43.                 'child'=>array(
  44.                     8=>array(
  45.                         'name'=>'Пермь',
  46.                         'parent'=>4,
  47.                         'child'=>array(),
  48.                     ),
  49.                     10=>array(
  50.                         'name'=>'Соликамск',
  51.                         'parent'=>4,
  52.                         'child'=>array(),
  53.                     ),
  54.                     11=>array(
  55.                         'name'=>'Кунгур',
  56.                         'parent'=>4,
  57.                         'child'=>array(),
  58.                     ),
  59.                 ),
  60.             ),
  61.         ),
  62.     ),
  63. );
Есть некие объекты, привязанные к региону по его ID. Как получить список всех вышестоящих регионов для конкретного объекта?

Это можно сделать при помощи вот такой рекурсивной функции:
  1. //--------------------------------------------------------------
  2. // Получение всех родительских элементов массива
  3. //--------------------------------------------------------------
  4. function get_parents($data$search_id, &$parents) {
  5.     foreach ($data as $id=>$item) {
  6.         if (get_parents($item['child'], $search_id$parents)) {
  7.             array_unshift($parents, array(
  8.                 'id'=>$id,
  9.                 'name'=>$item['name'],
  10.             ));
  11.             return true;
  12.         }
  13.         if ($id==$search_id) {
  14.             return true;
  15.         }
  16.     }
  17.     return false;
  18. }
Функция заточена на конкретную структуру отдельных элементов, я даже ее немного упростил, чтобы в результат попадали не все поля регионов, на практике структура регионов и выхлоп функции более обширный. При необходимости функцию можно легко переделать под ваши задачи. Вот несколько примеров использования:
  1. // Яхрома
  2. $parents=array();
  3. get_parents($regions9$parents);
Array (
    [0] => Array (
        [id] => 1
        [name] => Россия
    )
    [1] => Array (
        [id] => 2
        [name] => Москва и Московская область
    )
    [2] => Array (
        [id] => 5
        [name] => Московская область
    )
    [3] => Array (
        [id] => 6
        [name] => Дмитровский район
    )
)
  1. // Соликамск
  2. $parents=array();
  3. get_parents($regions10$parents);
Array (
    [0] => Array (
        [id] => 1
        [name] => Россия
    )
    [1] => Array (
        [id] => 4
        [name] => Пермский край
    )
)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 476 | Комментариев: 2

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (21.08.2017 в 11:35):
Свое, для внутреннего использования. Глобальная детализация и всеобъемлющий охват пока не нужны.
Alkov (21.08.2017 в 10:28):
КЛАДР или ФИАС ?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2018
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 2 (0.0054 сек.) / Память: 4.75 Mb
Наверх