volkovecgenei
@volkovecgenei
...

Как правильно организовать рекурсивный перебор?

function get_cat_recursive($id_check, $array_check, $array_temp)
{

  foreach ($array_check as $key => $value) {
    
    if ( $id_check == $value['parent_id']) {

      array_push($array_temp, $value['id']);
      get_cat_recursive($value['id'], $array_check, $array_temp);

    }

  }
  return $array_temp;

}

Есть массив
5c6ffb4be133d008361751.jpeg
Этот массив используется для вывода меня и категорий. Товары принадлежат только категориям последнего уровня вложенности, допусти есть полный путь до под категории: Рыбалка -> Удилище -> Болонское удилище, записан для товара будет id категории "Болонское удилище", мне же нужно вывести все товары, которые входят во все подкатегории категории "Рыбалка". Для этого нужно получить id всех подкатегорий входящих в Рыбалку. Я пытаюсь написать рекурсивный перебор, но почему-то он работает только для одного уровня вложенности. Как сделать чтобы при передаче в функцию id категории рыбалки, результатом был бы массив с id всех подкатегорий?
  • Вопрос задан
  • 292 просмотра
Решения вопроса 1
@artem78
У вас ошибка: когда вы делаете рекурсивный вызов, найденные в нём значения НЕ объединяются с текущими. Вот так должно быть:
$array_temp += get_cat_recursive($value['id'], $array_check, $array_temp);


А лучше передавать массив для результата по ссылке и каждый вызов функции будет добавлять в него то, что он нашёл. Исходный массив тоже желательно по ссылке, чтобы при каждом вызове функции не происходило его копирование в памяти.
function get_cat_recursive($id_check, &$array_check, &$array_temp)
{

  foreach ($array_check as $key => $value) {
    
    if ( $id_check == $value['parent_id']) {

      array_push($array_temp, $value['id']);
      get_cat_recursive($value['id'], $array_check, $array_temp);

    }

  }

}

// Использование
$result = []; // При первом вызове функции передаём пустой массив
get_cat_recursive(2, $all_cats, $result);
print_r($result);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
У вас не рекурсивная функция. Нужно передавать в нее &$array_temp, раз уж вы его заполняете.
А так каждый рекурсивный вызов работает со своей копией - вхолостую.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы