-1

代理店を表すテーブルがあります。各エージェンシーには、親 (fk_organismo) がある場合とない場合があります。親のないエージェンシー (fk_organismo = NULL) は、ルート エージェンシーです。

テーブル構造

完全な階層ツリーを構築でき、オプションのパラメーター fk_organismo (parent_agency_id) も受け取ることができる PHP 関数 (再帰的かどうかに関係なく) を手伝ってくれる人はいますか。このパラメーターが NULL でない場合、この特定の機関からツリーを構築する必要がありますか?

  1. ツリー内のすべての機関を表示する必要があります
  2. 特定のエージェンシーから始まるすべての子エージェンシーのツリーを表示する必要があります

また、2 つの個別の SQL クエリを作成する必要があると思います。1 つはすべてのエージェンシーを取得するためのもので、もう 1 つは特定のエージェンシーからすべての子を取得するためのものですが、よくわかりません...

事前にどうもありがとう

4

1 に答える 1

1

私はこのようなことを考えています(修正済み、テスト済み)

$conn = new mysqli("hostname","user","password","database");
if($conn->connect_errno) {
    printf("Connect failed: %s\n",$conn->connect_error);
    exit();
}

function dbToTree(){
//Set up your connection to mysql first
    global $conn;

    $sql = "SELECT * FROM `database`.`table` WHERE `fk_organismo` IS NULL ORDER BY `id` ASC LIMIT 1000;";

    $result = $conn->query($sql);

    for($i = 0; $db_array[$i] = $result->fetch_array(MYSQLI_ASSOC); $i++);

    array_pop($db_array); //The last part of the array is empty, remove it

    foreach($db_array as $row => $columns){
        $db_tree[$columns['nombre']]['info'] = $columns; //Tree root is ID of agency

        $db_tree[$columns['nombre']]['children'] = find_children($columns['id']);
    }
    return $db_tree;
}

function find_children($fk_organismo){
        global $conn;
        $sql = "SELECT * FROM `database`.`table` WHERE `fk_organismo` = " . $fk_organismo . " ORDER BY id desc";
        //die($sql);
        $result = $conn->query($sql);
        if(!$result) return NULL;
        for($i = 0; $tmp[$i] = $result->fetch_array(MYSQLI_ASSOC); $i++);

        array_pop($tmp);
        foreach($tmp as $tmp_row => $tmp_columns){
            $return[$tmp_columns['nombre']]['info'] = $tmp_columns;
            $return[$tmp_columns['nombre']]['children'] = find_children($tmp_columns['id']);
        }
        if(empty($return)) return NULL;
        return $return;
}
于 2013-04-18T15:17:41.340 に答える