Как контролировать глубину php бесконечного полюса классификации - PullRequest
2 голосов
/ 19 марта 2020

Вот мой массив:

 $list = array(
        array('id' => 3, 'name' => 'Phones', 'parent_id' => 0,),
        array('id' => 256, 'name' => 'Accessories', 'parent_id' => 0,),
        array('id' => 308, 'name' => 'Appliances', 'parent_id' => 0,),
        array('id' => 1057, 'name' => 'Smart', 'parent_id' => 0,),
        array('id' => 1065, 'name' => 'Smart Phones', 'parent_id' => 3,),
        array('id' => 1066, 'name' => 'Feature Phones', 'parent_id' => 3,),
        array('id' => 1069, 'name' => 'Samsung', 'parent_id' => 1065,),
        array('id' => 1070, 'name' => 'Apple', 'parent_id' => 1065,),
        array('id' => 1072, 'name' => 'Apple', 'parent_id' => 1066,),
        array('id' => 1075, 'name' => 'Tablets', 'parent_id' => 0,),
        array('id' => 1076, 'name' => 'Samsung', 'parent_id' => 1066,),
        array('id' => 1077, 'name' => 'All Brands', 'parent_id' => 1075,),
        array('id' => 1078, 'name' => 'Samsung', 'parent_id' => 1077,),
        array('id' => 1079, 'name' => 'Protector', 'parent_id' => 256,),
        array('id' => 1080, 'name' => 'Power', 'parent_id' => 256,),
        array('id' => 1081, 'name' => 'Cable', 'parent_id' => 256,),
        array('id' => 1082, 'name' => 'Memory', 'parent_id' => 256,),
    );

Это код, который я классифицировал:

function  quote_make_tree($list,$deep=1, $root = 0)
{
    $tree = $packData = [];
    foreach ($list as $row) {
        $packData[$row['id']] = $row;
    }

    foreach ($packData as $key => $val) {
        if ($val['parent_id'] == $root) {
            $tree[] = &$packData[$key];
        } else {
            $packData[$val['parent_id']]['children'][] = &$packData[$key];

        }

    }
    return $tree;
}

Я хочу добавить глубокий параметр $deep в quote_make_tree для управления глубина классификации.

Результат, который я хочу: Если $ deep = 1 Получить только данные с parent_id = 0:

 $one = array(
        0 => array('id' => 3, 'name' => 'Phones', 'parent_id' => 0,),
        1 => array('id' => 256, 'name' => 'Accessories', 'parent_id' => 0,),
        2 => array('id' => 308, 'name' => 'Appliances', 'parent_id' => 0,),
        3 => array('id' => 1057, 'name' => 'Smart', 'parent_id' => 0,),
        4 => array('id' => 1075, 'name' => 'Tablets', 'parent_id' => 0,),
    );

Если $ deep = 2 , Получить классификацию уровня 2 ниже уровня 1 классификация, если $ deep = 3, Получить все 1,2,3 классификации

Я попытался сначала получить все данные, а затем удалить данные в соответствии с $deep. Здесь demo Спасибо, ребята

1 Ответ

2 голосов
/ 19 марта 2020

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

function  quote_make_tree($list, $deep=1, $root = 0) {
    $output = [];
    foreach ( $list as $listItem )  {
        if ( $listItem['parent_id'] == $root ) {
            if ( $deep > 1 )    {
                $listItem['children'] = quote_make_tree($list, $deep-1, $listItem['id']);
            }
            $output[] = $listItem;
        }
    }
    return $output;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...