PHP Рекурсивная функция / цикл для определения самого низкого уровня (уровней) меню, элементов и т. Д. - PullRequest
0 голосов
/ 08 октября 2011

У меня проблемы с написанием простой (!) PHP-функции для возврата массива значений в следующем сценарии.

У меня есть таблица базы данных, в которой просто перечислены родительские и дочерние категории (например, menu, submenu, sub sub menu) в двух полях «parent_id» и «category_id».Я хочу проложить туннель через таблицу, чтобы извлечь все нижние category_ids - то есть те, которые не указаны как «родители» для других, но являются детьми (или внуками или правнуками) ввода category_id в функцию

У меня есть функция, похожая на эту (она работает на коде, основанном на osCommerce, поэтому запрос sql выглядит странно

function tep_get_bottom_categories( $categories_id) {
    $bottom_categories_query = tep_db_query("select categories_id from categories where parent_id = '" . $categories_id . "'");
    while ($bottom_categories = tep_db_fetch_array($bottom_categories_query)) {
        if(XXXXXXXXXXXXX)//<---- tried lots of stuff here
            {$results[]=$bottom_categories['categories_id'];}
        else
            {tep_get_bottom_categories( $bottom_categories['categories_id']);
        }
    }//end while loop 
}// end function

Если я введу значение для функции, которая имеет дочерние элементы, она выдастте, что находятся в массиве $ bottom_categories, а затем проделывают то же самое вплоть до финальных нижних категорий - однако они не выделены и не помещены в массив $ results, так как мне нужно что-то сделать, где XXXXXXXXXXXXXX, но это сильно уклоняется от меня.

Я предполагаю, что мне нужно каким-то образом пометить каждый цикл функции, но я не вижу, как - спасибо - Грэм

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Вы можете сделать это чисто в SQL:

SELECT category_id, (SELECT count(*) 
                     FROM categories AS ci 
                     WHERE ci.parent_id=co.category_id) AS children 
FROM categories AS co 
WHERE parent_id=xxxxx
HAVING children=0
0 голосов
/ 08 октября 2011

Я бы всегда запускал регистр else и проверял, есть ли у запроса какие-либо результаты.Если у него нет детей, вы готовы и вставьте его в список;в остальном то же самое, что и раньше.

Пример кода:

function tep_get_bottom_categories( $categories_id) {
  $bottom_categories_query = tep_db_query("select categories_id from categories where parent_id = '" . $categories_id . "'");

  if( /* check num_rows == 0 */ {
    {$results[]=$categories_id;}
  } else {
    while ($bottom_categories = tep_db_fetch_array($bottom_categories_query)) {
      {tep_get_bottom_categories( $bottom_categories['categories_id']);}
    }//end while loop 
  }
}// end function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...