Создайте вложенный массив из таблицы самообращения базы данных и отобразите в вложенном списке в шаблоне Smarty - PullRequest
2 голосов
/ 30 июня 2019

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

Table Categories:

id |      name         | parent_id
 1 |  Electronics      |   0
 2 |  Mobile           |   1
 3 |  iPhone           |   2
 4 |  Men              |   0
 5 |  Shirt            |   4

Я хочу, чтобы результат был таким, чтобы эти категории с parent_id = 0 становились родительскими и показывали вложенных дочерних элементов под ним: как показано ниже

Array ( 
    [0] => Array (
            [id] => 1 
            [name] => Electronics 
            [children] => Array (
               [0] => Array (
                        [id] => 2
                        [name] => Mobile
                        [children] => Array (
                                      [0] => Array (
                                             [id] => 3
                                             [name] => iPhone
                                             )
                                      )
                       )
             )
    [1] => Array (
            [id] => 4 
            [name] => Men 
            [children] => Array (
               [0] => Array (
                        [id] => 5
                        [name] => Shirt
                       )
             )
 )  

И вот код, который я написал до сих пор:

$parentCat = Shopware()->Db()->query("SELECT * FROM `categories`");
    $cats = [];
    foreach ($parentCat->fetchAll() as $key => $value) {
        $prevId = $value['parent_id'];
        if ($prevId == 0) {
            $data = [
                'id' => $value['id'],
                'name' => $value['name']
            ];
            array_push($cats, $data);
        } else {
            foreach ($cats as $cat) {
                if($value['parent_id'] == $cat['id']) {
                    $childData = [
                        'id' => $value['id'],
                        'name' => $value['name'],
                    ];
                    array_push($cats,$childData);

                }
            }
        }
    }
    print_r($cats);
    die();

Результат, который я получаю, выглядит так:

Array
(
[0] => Array
    (
        [id] => 1
        [name] => Electronics
    )

[1] => Array
    (
        [id] => 2
        [name] => Mobile
    )

[2] => Array
    (
        [id] => 3
        [name] => iPhone
    )

[3] => Array
    (
        [id] => 4
        [name] => Cars
    )

[4] => Array
    (
        [id] => 5
        [name] => Toyota
    )

)

Пожалуйста, помогите.

1 Ответ

1 голос
/ 30 июня 2019

Вы можете использовать рекурсивную функцию следующим образом:

function addToArr(&$arr, $data) {
    if ($data["parent_id"] == 0)
        return $arr[] =  ["id" => $data["id"], "name" => $data["name"], "children"=> []];
    foreach($arr as &$e) {
        if ($e["id"] == $data["parent_id"]) { // if found add as child
            $e["children"][] = ["id" => $data["id"], "name" => $data["name"], "children"=> []];
            break;
        }
        addToArr($e["children"], $data); // call recursively 
    }
}

Пример в реальном времени: 3v4l

Редактировать

Комуесть HTML тег:

function getHTMLformat($arr) {
    if (!$arr) return "";
    $str = "<ul>" . PHP_EOL; // starting the list 
    foreach ($arr as $e) {
        $str .= "<li>" . $e["name"] . getHTMLformat($e["children"]) . "</li>" . PHP_EOL;
    }
    return $str . "</ul>" . PHP_EOL; // end list
}

echo getHTMLformat($res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...