Вытащите всю ветвь массива (дерева), используя дочерний идентификатор - PHP Arrauu - PullRequest
0 голосов
/ 26 сентября 2018

Прежде всего, я уверен, что раньше это так или иначе спрашивали, но я не уверен, как правильно это произнести, так что потерпите меня на минутку.

У меня есть массив Category для моегоСкрипт магазина со всеми категориями моих товаров, отсортированными по веткам под названием $categoryTree.Он устанавливает связь категорий с их тегом c.parentcatid.Он построен с использованием следующей функции:

public function buildStoreCategoryTree(array $elements, $parentId = 0) {
    $branch = array();
    foreach ($elements as $element) {
        if ($element['c.parentcatid'] == $parentId) {
            $children = $this->buildStoreCategoryTree($elements, $element['c.id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }
    return $branch;
}

Вот схема структуры базы данных, в которой все данные хранятся для информации о категориях (все это передается в вышеуказанную функцию):

enter image description here

И, наконец, вот информация ПОСЛЕ того, как она была отсортирована с помощью вышеуказанной функции в ДЕРЕВО:

Array ( 
    [0] => Array ( 
        [0] => 1 [c.id] => 1 
        [1] => Radios [c.name] => Radios 
        [2] => radios [c.path] => radios 
        [3] => 0 [c.parentcatid] => 0 
        [children] => Array ( 
            [0] => Array ( 
                [0] => 2 [c.id] => 2 
                [1] => Motorola Radios [c.name] => Motorola Radios 
                [2] => motorola [c.path] => motorola 
                [3] => 1 [c.parentcatid] => 1 
                [children] => Array ( 
                    [0] => Array ( 
                        [0] => 3 [c.id] => 3 
                        [1] => Motorola Handheld Radios [c.name] => Motorola Handheld Radios 
                        [2] => handheld [c.path] => handheld 
                        [3] => 2 [c.parentcatid] => 2 
                    ) 
                    [1] => Array ( 
                        [0] => 4 [c.id] => 4 
                        [1] => Motorola Mobile Radios [c.name] => Motorola Mobile Radios 
                        [2] => mobile [c.path] => mobile 
                        [3] => 2 [c.parentcatid] => 2 
                    )
                ) 
            ) 
            [1] => Array (
                [0] => 5 [c.id] => 5 
                [1] => Icom Radios [c.name] => Icom Radios 
                [2] => icom [c.path] => icom 
                [3] => 1 [c.parentcatid] => 1 
                [children] => Array ( 
                    [0] => Array (
                        [0] => 6 [c.id] => 6 
                        [1] => Icom Handheld Radios [c.name] => Icom Handheld Radios 
                        [2] => handheld [c.path] => handheld 
                        [3] => 5 [c.parentcatid] => 5 
                    ) 
                    [1] => Array ( 
                        [0] => 7 [c.id] => 7 
                        [1] => Icom Mobile Radios [c.name] => Icom Mobile Radios 
                        [2] => mobile [c.path] => mobile 
                        [3] => 5 [c.parentcatid] => 5 
                    ) 
                ) 
            ) 
            [2] => Array (
                [0] => 8 [c.id] => 8 
                [1] => Mics & Speakers [c.name] => Mics & Speakers
                [2] => mics-and-speakers [c.path] => mics-and-speakers 
                [3] => 1 [c.parentcatid] => 1
            ) 
            [3] => Array ( 
                [0] => 9 [c.id] => 9 
                [1] => Mounting Hardware [c.name] => Mounting Hardware 
                [2] => mounts [c.path] => mounts 
                [3] => 1 [c.parentcatid] => 1 
            ) 
            [4] => Array ( 
                [0] => 10 [c.id] => 10 
                [1] => Clips & Assorted [c.name] => Clips & Assorted 
                [2] => other [c.path] => other 
                [3] => 1 [c.parentcatid] => 1 
            ) 
        ) 
    ) 
    [1] => Array ( 
        [0] => 11 [c.id] => 11 
        [1] => Miscellaneous [c.name] => Miscellaneous 
        [2] => misc [c.path] => misc 
        [3] => 0 [c.parentcatid] => 0 
        [children] => Array (
            [0] => Array (
                [0] => 12 [c.id] => 12 
                [1] => LED Lightbars & Products [c.name] => LED Lightbars & Products 
                [2] => led [c.path] => led 
                [3] => 11 [c.parentcatid] => 11 
            ) 
        ) 
    ) 
)

ТеперьЕсли у меня есть предмет из категории 4, он считается Handheld radio, потомком Motorola и Radio .На предмете я храню этот идентификатор as catid = '4'.Теперь мне нужно найти способ получить всю информацию сверху ветви 4 к первому результату (радио -> моторола -> портативное устройство -> пункт здесь).Я бы предпочел перечислять их по порядку, начиная сверху вниз, чтобы я мог пройти по циклу и построить путь к элементу /store/radios/motorola/handheld/item.html, используя только идентификатор дочернего элемента в качестве начального ключа.

Возможно ли это с помощью этого макета?Заранее спасибо

1 Ответ

0 голосов
/ 26 сентября 2018

В дополнение к дочернему дереву вам необходимо создать массив, который сопоставляет идентификаторы записей с записями, после чего вы можете переходить от любого идентификатора вашей целевой записи.

<?php
//Mock category records, would come from the DB in the real world
$categoryRecords = [
    ['id' => 1, 'title' => 'Radios', 'slug'=>'radios', 'parent_id' => 0],
    ['id' => 2, 'title' => 'Accessories', 'slug'=>'misc', 'parent_id' => 1],
    ['id' => 3, 'title' => 'Motorola', 'slug'=>'motorola', 'parent_id' => 1],
    ['id' => 4, 'title' => 'Handheld', 'slug'=>'handheld', 'parent_id' => 3],
    ['id' => 5, 'title' => 'Mobile', 'slug'=>'mobile', 'parent_id' => 3],
    ['id' => 6, 'title' => 'Level 3', 'slug'=>'level-3', 'parent_id' => 5],
    ['id' => 7, 'title' => 'Level 4', 'slug'=>'level-4', 'parent_id' => 6]
];

//Create an array that maps IDs to records
$idMap = [];

foreach($categoryRecords as $currRecord)
{
    $idMap[$currRecord['id']] = $currRecord;
}

/*
 * Now would be a good time to cache this map in something like Redis or Memcache so you don't have to pull
 * the whole category table during every request.
 */

/**
 * Return an array of parent category records for a given category ID
 * @param int $categoryId
 * @return array
 */
function findParentCategories($categoryId)
{
    global $idMap;

    $categories=[];

    while(array_key_exists($categoryId, $idMap))
    {
        $currParentId = $idMap[$categoryId]['parent_id'];
        $categories[] = $idMap[$categoryId];

        $categoryId = $currParentId;
    }

    $categories = array_reverse($categories);

    return $categories;
}

//ID of category requested
$requestedId = 3;

/*
 * Top-to-bottom list of parent categories
 */
$parentCategories = findParentCategories($requestedId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...