2013-04-04 5 views
0

Я пытаюсь внедрить систему категорий на своем веб-сайте. Проблема в том, что категория может иметь ребенка. До сих пор мой стол category выглядит следующим образом:Рекурсивный цикл для категории

id, name, parent_id 

До сих пор я сделал петлю, но она работает только на 2-х уровнях. Вот мой код:

for($i=0;$i<count($data);$i++){ 
    $tree[$data[$i]->name] = array(); 
    for($j=0;$j<count($data);$j++){ 
     if($data[$j]->parent_id == $data[$i]->id){ 
      $tree[$data[$i]->name][] = $data[$j]->name; 
     } 
    } 
} 

Это вернуть мне массив как это:

Array 
(
    [0] => Array 
     (
      [1] => Cat1 
      [children] => Array 
       (
        [12] => sub cat 1 
        [13] => sub cat 2 
        [14] => sub cat 3 
       ) 

     ) 

    [1] => Array 
     (
      [2] => Cat2 
     ) 

    [2] => Array 
     (
      [3] => Cat3 
     ) 
) 

Как я могу сделать его эффективным и рекурсивный иметь что-то подобное:

Array 
(
    [0] => Array 
     (
      [1] => Cat1 
      [children] => Array 
       (
        [12] => sub cat 1 
        [13] => sub cat 2 
        [14] => sub cat 3 
         [children] => Array 
          (
           [1] => sub sub cat 1 
          ) 
       ) 

     ) 

    [1] => Array 
     (
      [2] => Cat2 
     ) 

    [2] => Array 
     (
      [3] => Cat3 
     ) 
) 

Благодарности ваша помощь

EDIT

Я работаю на Zend, и вернуть меня больше data, как это:

Zend_Db_Table_Rowset Object 
(
    [_data:protected] => Array 
     (
      [0] => Array 
       (
        [id] => 1 
        [name] => Cinema 
        [type] => category 
        [slug] => cinema 
        [parent_id] => -1 
       ) 

      [1] => Array 
       (
        [id] => 2 
        [name] => Horror 
        [type] => category 
        [slug] => horror 
        [parent_id] => 1 
       ) 

ответ

2

Если вы хотите применить этот тип структуры лучше использовать child в другой таблице с родительским идентификатором, как foreign key. так что у вас может быть рекурсивная публикация категории. поэтому структура таблицы будет как этот

ch_id, parent_id, child 
+0

Привет, да, я знаю, но, к сожалению, у меня нет выбора, я должен использовать его так, как это в настоящее время – lkartono

+0

до какого уровня у хочу вложенную категорию Если у у вас есть 2-3 слоя, чем ваш код является перфективным с еще одним циклом ... – Shwet

+0

Нет предела вложенного уровня. Должен ли я просто использовать 2 таблицы в этом случае? – lkartono

0

Вы должны проверить Nested Sets, методологию для хранения и извлечения даты деревьев в/из реляционных баз данных (то, что на самом деле ваши категории). Для этого вам нужно немного адаптировать схему базы данных (как описано в ссылке или в нескольких учебниках о вложенных наборах). Для PHP существует несколько библиотек, обеспечивающих возможности Nested Set, например this list.

0

Это должно помочь вам. Итерирует каждый элемент массива и проверяет его позицию в древовидной структуре на уровень и зависимость.

function get_children($data, $parent_id = false) { 
    $result = array(); 
    foreach ($data as $i => $content) { 
    if ($parent_id != false && $content['id'] != $parent_id) # other levels 
     continue; 
    if ($parent_id === false && !empty($content['parent_id'])) # top level 
     continue; 

    $leaf = array(
     'id' => $content['id'], 
     'parent_id' => $content['parent_id'], 
     'name' => $conten['name'] 
    ); 
    $leaf['children'] = get_children($data, $leaf['id']); 
    $result[$leaf['id']] = $leaf; 
    } 
    return $result; 
} 

$result = get_children($data); 
print_r($result); 

Edit: исправлены ошибки

+0

Привет, спасибо, но все еще не работает, но я сейчас ближе к его решению. Фактически эта строка 'if ($ content ['id'] == $ data ['parent_id']) {' не может работать, поскольку $ data является массивом всех категорий, поэтому я не могу получить доступ к $ data ['parent_id '] – lkartono

+0

@ user1965817 ах, вы правы, подождите, я исправлю это. будет немного медленнее, хотя – scones

+0

Хм, да, вы были правы, это слишком медленно. У меня есть «Fatal error: Allowed memory size», поэтому я могу пойти на 2 таблицы в этом случае, возможно, будет намного проще. Думал? – lkartono

Смежные вопросы