sql >> データベース >  >> RDS >> Mysql

mysqlクエリ結果でphpを使用して、親の下にあるすべての子、孫などのノードを取得します

    編集:

    以前、提供した出力から多次元配列を構築するソリューションと、特定のidのすべての子要素を取得する方法を投稿しました。 その特定の配列から。これで、出力から直接子要素を取得する方法がわかりました(最初にbuildtree()を実行する必要はありません。 機能:

    function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array())
    {
        foreach($src_arr as $row)
        {
            if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid)
            {
                $rowdata = array();
                foreach($row as $k => $v)
                    $rowdata[$k] = $v;
                $cats[] = $rowdata;
                if($row['parent_id'] == $currentid)
                    $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true));
            }
        }
        return $cats;
    }
    

    上記の関数を使用するには、出力配列$dataを渡すだけです。 最初の引数とid 2番目の引数から子要素を取得する場合:

    例:

    $list = fetch_recursive($data, 3);
    

    これにより、idの正しい配列構造が得られます。 3 (この回答の最後のコードボックスの例に見られるように)

    元の回答:

    これまで、この設計からネストされたツリーを構築するための再帰関数を作成することはできませんでした。同様の関数を作成した人は他にもたくさんいると思いますが、これは間違いなく機能するはずです:

    function buildtree($src_arr, $parent_id = 0, $tree = array())
    {
        foreach($src_arr as $idx => $row)
        {
            if($row['parent_id'] == $parent_id)
            {
                foreach($row as $k => $v)
                    $tree[$row['id']][$k] = $v;
                unset($src_arr[$idx]);
                $tree[$row['id']]['children'] = buildtree($src_arr, $row['id']);
            }
        }
        ksort($tree);
        return $tree;
    }
    

    この関数は、隣接リストからツリーを再帰的に構築し、IDの昇順を維持します。これにより、idも作成されます 各親/子の情報の各配列のキー。

    このコード:

    $r = mysql_query("SELECT * FROM test ");
    $data = array();
    while($row = mysql_fetch_assoc($r)) {
        $data[] = $row;
    }
    echo '<pre>';
    print_r(buildtree($data));
    echo '</pre>';
    
    ';

    次のような出力になります:

    Array 
    (
        [1] => Array 
        (
            [id] => 1
            [name] => Electronics 
            [parent_id] => 0 
            [children] => Array
            (
                [2] => Array 
                ( 
                    [id] => 2
                    [name] => Televisions 
                    [parent_id] => 1 
                    [children] => Array
                    (
                        [4] => Array 
                        (
                            [id] => 4
                            [name] => Tube 
                            [parent_id] => 2
                            [children] => Array()
                        )
                        [5] => Array 
                        (
                            [id] => 5
                            [name] => LCD 
                            [parent_id] => 2
                            [children] => Array()
                        )
                        [6] => Array
                        (
                            [id] => 6
                            [name] => Plasma 
                            [parent_id] => 2
                            [children] => Array()
                        )
                    )
                )
                [3] => Array 
                (
                    [id] => 3
                    [name] => Portable Electronics 
                    [parent_id] => 1
                    [children] => Array
                    (
                        [7] => Array
                        (
                            [id] => 7
                            [name] => Mp3 Players 
                            [parent_id] => 3 
                            [children] => Array
                            (
                                [10] => Array
                                (
                                    [id] => 10
                                    [name] => Flash 
                                    [parent_id] => 7
                                    [children] => Array()
                                ) 
                            )
                        )
                        [8] => Array 
                        (
                            [id] => 8
                            [name] => CD Players 
                            [parent_id] => 3
                            [children] => Array()
                        )
                        [9] => Array 
                        (
                            [id] => 9
                            [name] => 2 Way Radios 
                            [parent_id] => 3
                            [children] => Array()
                        )
                    )
                )
            )
        )
    )
    

    特定のidのすべての子ノードを取得するには 1次元配列では、次の関数を使用できます:

    function fetch_recursive($tree, $parent_id, $parentfound = false, $list = array())
    {
        foreach($tree as $k => $v)
        {
            if($parentfound || $k == $parent_id)
            {
                $rowdata = array();
                foreach($v as $field => $value)
                    if($field != 'children')
                        $rowdata[$field] = $value;
                $list[] = $rowdata;
                if($v['children'])
                    $list = array_merge($list, fetch_recursive($v['children'], $parent_id, true));
            }
            elseif($v['children'])
                $list = array_merge($list, fetch_recursive($v['children'], $parent_id));
        }
        return $list;
    }
    

    buildtree()に基づく 上記の関数で、idのすべての子ノードを取得したいとします。 3:

    echo '<pre>';
    print_r(fetch_recursive(buildtree($a), 3));
    echo '</pre>';
    
    ';

    これにより、次のように出力されます:

    Array
    (
        [0] => Array
            (
                [id] => 3
                [name] => Portable Electronics
                [parent_id] => 1
            )
    
        [1] => Array
            (
                [id] => 7
                [name] => Mp3 Players
                [parent_id] => 3
            )
    
        [2] => Array
            (
                [id] => 10
                [name] => Flash
                [parent_id] => 7
            )
    
        [3] => Array
            (
                [id] => 8
                [name] => CD Players
                [parent_id] => 3
            )
    
        [4] => Array
            (
                [id] => 9
                [name] => 2 Way Radios
                [parent_id] => 3
            )
    
    )
    


    1. PLSQLを使用してApex表形式を更新

    2. PostgreSQLで「not-null-string」配列のタイプの列を宣言します

    3. 列SQLの数値のみのデータで行をフィルタリングします

    4. utl ファイルの名前変更操作に失敗しました