2012-03-01 2 views
0
function my_recurse($id,$tree=array()) 
{ 


    $hols = array(); 


    $overall = array(); 
    $asd = $this->db->get_where('story', array('story_id'=>$id))->row_array(); 

    if(isset($asd['story_id'])){ 

    $preds = explode(',',$asd['story_pred']); 

      if($preds[0] != 0) 
      { 

       $hols[] = $preds[0]; 

       $hols = array_merge($tree, $hols); 
       $this->my_recurse($preds[0],$hols); 

      } 


    }  
    print_r($hols); 
} 

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

story1 NULL story2 story1 Story3 story2 story4 Story3

и когда я вхожу story4 как мой идентификатор в функции он всегда возвращает story3, а не story1, story2 и story3. не знаю, почему он меняет результат после рекурсии. любые предложения были бы оценены

+0

Бит трудно понять. Короткие имена переменных делают код трудным для чтения, если вы незнакомы. Кроме того, что должно быть достигнуто? –

+0

«отменяет» выход? –

+0

да .. он меняет выходной результат .. скажем, например, дерево, как этот story1-> story2-> story3-> story4, вызывающий my_recurse (story4). Я ожидал, что результатом будет массив (story1) для первого массива рекурсивных событий (story1 , story2) для 2-го и массива (story1, story2, story3) для последнего, но когда я печатаю после каждой рекурсии, это похоже на этот массив (story1, story2, story3), затем массив (story2, story3) и массив (story3) поэтому, когда я возвращаю hols, он всегда возвращает story3 – user1073113

ответ

0

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

+0

моя структура базы данных похожа на это. story_id: 4 story_pred: 2,3,4 story_name: story16 im делает imode и взрывается, чтобы сохранить предшественников, потому что я не предпочитаю создавать таблицу специально для предшественников и преемников – user1073113

0

Проблема с вашим кодом в том, что его передает текущие данные до родителя, следовательно, обратное дерево. Вместо этого он должен быть получать в Preds от родителя

Это должно работать, если я понял ваши требования ясно

<?php 
function my_recurse($id) { 

    $hols = array(); 
    $overall = array(); 

    $asd = getFromDB($id); 

    if(isset($asd['story_id'])){ 
     $preds = explode(',',$asd['story_pred']); 

     if($preds[0] != 0) { 
      $hols[] = $preds[0]; 
      $hols = array_merge(my_recurse($preds[0]), $hols); 
     } else { 
      return $hols; 
     } 

     print "preds of {$id} : "; 
     print implode(', ', $hols) . "\n"; 
     return $hols; 
    } 
} 

function getFromDB($id) { 
    $data = array(1 => array('story_id'=>1, 'story_pred' => '0'), 
        2 => array('story_id'=>2, 'story_pred' => '1'), 
        3 => array('story_id'=>3, 'story_pred' => '2'), 
        4 => array('story_id'=>4, 'story_pred' => '3'), 
       ); 

    return $data[$id]; 
} 

my_recurse(4); 

Запуск выше сценарий ..

$ /usr/bin/php recurse.php 
preds of 2 : 1 
preds of 3 : 1, 2 
preds of 4 : 1, 2, 3 

PS: Пожалуйста, добавьте ваш ввод проб, выход и ожидаемый выход. Мне потребовалось 15 минут, чтобы попытаться понять вашу проблему.

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