Собрать в массив из рекурсии

245
26 сентября 2017, 07:59
   function get_data_dynamic_link($parent){
        $var = array();
        $db_query = "select * from ".DB_PREF."dynamic 
                     where id_parent = ".$parent." ";
        list($kolvo, $data_prop) = obr_db_query_select_one_assoc($db_query);
        if($kolvo){
            $var[] = $data_prop['id'];
            $var[] = get_data_dynamic_link($data_prop['id_properties']);
        }
        return $var; 
   }

Здравствуйте. Подскажите, почему данный код возвращает массив с наращиванием вложенностей

array(2) { 
    [0]=> string(1) "6"
    [1]=> array(2) { 
         [0]=> string(1) "7" 
         [1]=> array(0) { 
         }
    } 
}

когда мне нужно, чтобы было так

array(2) {
    [0]=> string(1) "6"
    [1]=>  string(1) "7"  
}

Что нужно исправить ? спасибо

Answer 1

Без тестовых данных проверить сложно,

function get_data_dynamic_link($parent){
    static $var = [];        
    $db_query = "select * from ".DB_PREF."dynamic 
                 where id_parent = ".$parent." ";
    list($kolvo, $data_prop) = obr_db_query_select_one_assoc($db_query);
    if($kolvo){
        $var[] = $data_prop['id'];
        get_data_dynamic_link($data_prop['id_properties']);
    }
    return $var; 
} 

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

Answer 2

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

function get_data_dynamic_link($parent, $array = array()){
    $db_query = "select * from ".DB_PREF."dynamic 
                 where id_parent = ".$parent." ";
    list($kolvo, $data_prop) = obr_db_query_select_one_assoc($db_query);
    if ($kolvo){
        array_push($array, $data_prop['id']);
        $array = get_data_dynamic_link($data_prop['id_properties'], $array);
    }
    return $array; 
}

Мы получаем массив и добавляем в него элемент, если массив не передаем, создается новый

READ ALSO
Простой вопрос про php класс

Простой вопрос про php класс

здравствуйте, есть класс, в котором есть функция к примеру

301
расчитать процент между двумя числами

расчитать процент между двумя числами

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

233
Run-Time Check Failure #3 - T

Run-Time Check Failure #3 - T

Ошибка при отладке в Visual Studio 2015Если вводить значение больше единицы то программа работает, вводишь меньше - ломается

291