Помогите с рекурсией данной функции

164
22 февраля 2018, 15:44

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

        foreach ( $args as $val ) {
        if ( $val['parent'] == 0 ) {
            array_push( $attr, $val );
            foreach ( $args as $val1 ) {
                if ( $val1['parent'] == $val['ID'] ) {
                    array_push( $attr, $val1 );
                    foreach ( $args as $val2 ) {
                        if ( $val2['parent'] == $val1['ID'] ) {
                            array_push( $attr, $val2 );
                            foreach ( $args as $val3 ) {
                                if ( $val3['parent'] == $val2['ID'] ) {
                                    array_push( $attr, $val3 );
                                    foreach ( $args as $val4 ) {
                                        if ( $val4['parent'] == $val3['ID'] ) {
                                            array_push( $attr, $val4 );
                                            foreach ( $args as $val5 ) {
                                                if ( $val5['parent'] == $val4['ID'] ) {
                                                    array_push( $attr, $val5 );
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }  

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

Answer 1

Не совсем понял, какого результата необходимо добиться и каковы исходные данные, но

Если есть просто список элементов, у которых указаны родители (parent_id) и их нужно отсортировать в ряд, (родитель 1, потомок 1 родителя 1, потомок 2 родителя 1, родитель 2, потомок 1 родителя 2...) то вроде должен подойти такой вариант:

function recursiveSort(&$args, $parentId = 0){
    $results = [];
    foreach($args as $item){
        if($item['parent'] == $parentId){
            $results[] = $item;
            $results = array_merge($results,recursiveSort($args,$item['id']));
        }
    }
    return $results;
}

Если необходимо создать вложенный древовидный массив (то есть у каждого элемента данного массива будет свой массив его потомков), то должен вроде подойти такой вариант:

function recursiveTreeBuild(&$args, $parentId = 0)
{
    $results = [];
    foreach($args as $item){
        if($item['parent'] == $parentId){
            $results[] = $item;
            $results[count($results)-1]['items'] = recursiveTreeBuild($args,$item['id']);
        }
    }
    return $results;
}

Не проверял, возможно где-то ошибся, но вроде должно работать.

READ ALSO
Выбор страницы из массива

Выбор страницы из массива

Есть массив страниц, в котором ключ является название рубрики, а значение ключа является список страниц в этой рубрикеP

212
Почему функции wordpress не работают в mail.php?

Почему функции wordpress не работают в mail.php?

Сайт на wordpressОтправка почты через ajax в таком виде работает:

198
Как сделать доп услуги в оформление заказа Битрикс?

Как сделать доп услуги в оформление заказа Битрикс?

Здравствуйте, подскажите пожалуйста, как можно реализовать функционал доп услуги (добавляется сумма 500 руб или другое значение берется из админки)...

190
Как запустить PHP несколько раз без Cron

Как запустить PHP несколько раз без Cron

Добрый вечер всем ! Столкнулся с такой задачей, что нужно запустить PHP скрипт несколько раз, но не через Cron, тк

211