0

您好我有一个自引用的数据库表,基本上它包含所有物种和分类级别。所以例如我们在下面有一个海龟记录

tsn_id   name  rank_id  parent_id
123       turtle       220       349

此海龟记录的父级是turtle_family 记录(在同一张表中),一直持续到 parent_id 为 0。0 表示动物王国(animalia parent_id 0)

tsn_id   name         rank_id  parent_id
349      turtle_family 210     465

我想爬上每个物种记录的水平,比如乌龟。这是我的尝试

<?php


function get_each_species_record(){

  $db = dbConnect();

  $query= "select * from species_records where rank_id = 220"; //this rank_id is species

  $result = $db -> Execute($query);

    while($row=$result->FetchRow())
    {
        $tsn_id= $row['tsn']; 
        $complete_name = $row['complete_name'];
        $parent_tsn = $row['parent_tsn'];
        $rank = $row['rank_id'];

        //* My objective *

        //for each species
        //take its parent tsn
        //where tsn = parent tsn
        //take that parents tsn
        //where tsn = parent tsn
        //till parent tsn = 0

       climbtree($tsn_id);

    }
}

//recursive function for each species

 function climbtree($tsn_id){

          if($parent_tsn == 0){
            return 1; //quit and go onto next speices record?

          }
          else{
            $queryone= 'select * from species_records where tsn = $parent_tsn';
            $resultone = $db -> Execute($queryone);
            return climbtree($tsn_id);
          }

  }


?>
4

1 回答 1

0
function get_species($specie_id, $db = null) {
    if ($specie_id === '0') {
        return array();
    }
    if ($db === null) {
       $db = dbConnect();
    }
    $query = "SELECT * FROM species_records WHERE rank_id = $specie_id";
    $result = $db->Execute($query);
    $row = $result->FetchRow();
    return array_merge($row, array('parent' => get_species($row['parent_tsn'], $db);
}

这可以很好地进行递归,尚未测试 array_merge 是否会以您希望的方式显示结果,但这实际上会给您一个关联数组,每个动物都有他的父母,直到它到达它的父母的动物界是一个空数组。

我还处理了内部的数据库连接,因此您不会在每个级别都重新创建连接。

这有点多余的递归,我建议您为插入到创建其父母的系统的每只动物都有一个缓存表,因此每当您想检查动物的前身时,您可以只做一个SELECT而不是递归.

IE

TABLE species_records_familiy_tree
tsn_id | parents
123    | 0,2,36,77,463,349
于 2013-07-18T06:42:47.143 回答