[WordPress] php でユニークな名前を持つ再帰関数

スポンサーリンク

Question

ダムの両方のフィールドが格納親 goat_name と 1) 私はドロップダウン ・ リストからヤギの選択し goat_id とその種馬を持つ

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

私を使ってこの関数の無限ループに行く最初の選択した雄親およびダム

この構造のために従ってください:

答え

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

し recusrive の呼び出しで使用される指定された ID をフェッチする:

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

を再帰的なイテレーションごとに、同じ 山羊についての情報をフェッチを保つように。ヤギ # 42-ヤギ #42 > -> ヤギ #42 など.再帰/メモリの制限をヒットするまでです

再帰呼び出しダム/雄親の Id を使用する必要があります:

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

代わり

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

の答え

のような何かにテーブル構造を更新する必要があります

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 "
  • Sire: ".$row2['sire_name']; generate_tree($row2['sire_id']); echo "
  • "; echo "
  • Dam: ".$row2['dam_name']; generate_tree($row2['dam_id']); echo "
  • ";

    http://stackoverflow.com/questions/27130672/recursive-function-with-unique-name-in-php

    スポンサーリンク

    Leave a Reply