2014-11-25 3 views
-2

1) Я выбираю козу из раскрывающегося списка и имея goat_id, а его сир и дамба оба поля - это родительское имя goat_name.Рекурсивная функция с уникальным именем в php

2) Я пытаюсь вызвать его рекурсивно с помощью goat_name, для каждого сира и плотины оба поля.

function generate_tree($goat_id) 
{ 
    global $wpdb; 

    // get all records from database whose parent is $id 
    $sql = $wpdb->prepare("SELECT * FROM mm_goats WHERE id = %d", $goat_id); 
    $row2 = $wpdb->get_row($sql, ARRAY_A); 

    //check if there are any results 

     if(!empty($row2)) 
     { 
      echo "<ul>"; 
      if($row2['sire'] != "" || $row2['dam'] != "") 
      { 
       //print result and call function to check if it has children 
       echo "<li>Sire: ".$row2['sire']."</li>"; 
       echo "<li>Dam: ".$row2['dam']."</li>"; 
       generate_tree($row2['id']); 
      } 
      echo "</ul>"; 
     } 
} 

Эта функция используется для бесконечной петли с первым выбранным сиром и плотиной.

Следуйте за этой структурой. напр: enter image description here

+0

Вы проходите мимо e ID текущего козла к вашей рекурсивной функции, а не идентификаторы сира/дамбы, поэтому вы выполняете 'generate_tree (42);', который затем вызывает 'generate_tree (42)', который затем вызывает и т. д. –

+1

Как можно встретить бесконечный цикл без цикла? –

+0

Ох. Я вижу это сейчас .. Я думал @MarcB Говорит о тарабарщине .. Я был не прав .. oops –

ответ

-1
$sql = $wpdb->prepare("SELECT * FROM mm_goats WHERE id = %d", $goat_id); 
                ^^^^^^^       

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

  generate_tree($row2['id']); 
          ^^^^^^^^^^^ 

Таким образом, вы просто держать извлечение информации о ЖЕ козу на каждый рекурсивный итерация. Goat # 42 -> Goat # 42 -> Goat # 42 и т. Д., Пока вы не достигнете предела рекурсии/памяти.

Ваш рекурсивный вызов должен быть с помощью плотины/SIRe идентификаторы:

generate_tree($row['id_of_dam']); 
    generate_tree($row['id_of_sire']); 

вместо этого.

#42 -> #7,10 -> #1,2,3,4 etc... 
-1

Вы должны обновить структуру таблицы на что-то вроде

mm_goats 
    - id 
    - sire_id 
    - dam_id 
    - name 

, то вы можете сделать внутреннее соединение, чтобы выбрать их

SELECT `mm_goats`.`name`, `mm_goats`.`sire_id`, `mm_goats`.`dam_id`, `sire`.`name` AS `sire_name`, `dam`.`name` AS `dam_name` 
    FROM `mm_goats` 
     INNER JOIN `mm_goats` AS `sire` ON `mm_goats`.`sire_id` = `sire`.`id` 
     INNER JOIN `mm_goats` AS `dam` ON `mm_goats`.`dam_id` = `dam`.`id` 
    WHERE `mm_goats`.`id` = %d 

после этого, то вы можете начать свой рекурсию

echo "<li>Sire: ".$row2['sire_name']; 
generate_tree($row2['sire_id']); 
echo "</li>"; 
echo "<li>Dam: ".$row2['dam_name']; 
generate_tree($row2['dam_id']); 
echo "</li>"; 
Смежные вопросы