0

テーブル

cat_id | cat_parent_id | cat_name   
---------------------------------
12     |      0        |  Car    
13     |      0        |  Manga      
14     |      12       |  Volvo      
15     |      12       |  Mercedes-Benz      
16     |      13       |  Naruto     
17     |      13       |  Hunter X Hunter
18     |      0        |  Animals


データベースでカテゴリを取得して配列に入れてから、その配列を使用してドロップダウンリストのコードを作成しようとしています。ここにコードがあります。

while($row = dbFetchArray($result)) {
        list($id, $parentId, $name) = $row;

        if ($parentId == 0) {
            // we create a new array for each top level categories
            $categories[$id] = array('id' => $id, 'name' => $name, 'children' => array());
        } else {
            // the child categories are put int the parent category's array
            $categories[$parentId]['children'][] = array('id' => $id, 'name' => $name); 
        }
}

$list = '';
    foreach ($categories as $key => $value) {
        $name     =  "--" . strtoupper($value['name']) . "--";
        $children = $value['children'];

        $list .="<option value=\"{$value['id']}\"";
        if ($value['id'] == $catId) {
                $list.= " selected";
        }
        $list .= ">$name</option>\r\n";


        foreach ($children as $child) {
            $list .= "<option value=\"{$child['id']}\"";
            if ($child['id'] == $catId) {
                $list.= " selected";
            }

            $list .= ">{$child['name']}</option>\r\n";
        }


    }


$categories 配列の最終値

Array
(
    [12] => Array
        (
            [id] => 12
            [name] => Car
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 14
                            [name] => Volvo
                        )

                    [1] => Array
                        (
                            [id] => 15
                            [name] => Mercedez-Benz
                        )

                )

        )

    [13] => Array
        (
            [id] => 13
            [name] => Manga
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 16
                            [name] => Naruto
                        )

                    [1] => Array
                        (
                            [id] => 17
                            [name] => Hunter X Hunter
                        )

                )

        )

    [18] => Array
        (
            [id] => 18
            [name] => Animals
            [children] => Array
                (
                )

        )

)


しかし、キー「名前」の値で $categories を並べ替えたいと思います。

私は何度も試しましたが、これまでのところこれが私の解決策です。

function sortByName($a, $b) {
    return strcmp($a["name"], $b["name"]);
}

usort($categories,"sortByName");

foreach($categories as $k => $v){
    foreach($v as $kk => $vv) {

        if ($kk == "children") {
            usort($vv,"sortByName");

            print_r($vv );

        }
    }
}


私の問題は、最初のレベルのキー「名前」がうまくソートされることですが、2番目のレベルをソートする私の解決策はうまくいきませんでした。

また、並べ替えが行われると、並べ替えた配列のインデックスは 0 1 2 3 になります。

たとえば、キー「name」の値でこれをソートすると、18 12 13 は 0 1 2 になります

Array(
    [18] => Array
        (
            [id] => 18
            [name] => aa


        )

    [12] => Array
        (
            [id] => 12
            [name] => Car


        )

    [13] => Array
        (
            [id] => 13
            [name] => Manga


        )            
)

どうすればソートできますが、18 12 13 も変更しないでください。




だから私は $categories 配列をこれにしたい

Array
(

    [18] => Array
        (
            [id] => 18
            [name] => Animals
            [children] => Array
                (
                )

        )

    [12] => Array
        (
            [id] => 12
            [name] => Car
            [children] => Array
                (
            [0] => Array
                        (
                            [id] => 15
                            [name] => Mercedes-Benz
                        )

                    [1] => Array
                        (
                            [id] => 14
                            [name] => Volvo
                        )

            )

        )

    [13] => Array
        (
            [id] => 13
            [name] => Manga
            [children] => Array
                (
            [0] => Array
                        (
                            [id] => 17
                            [name] => Hunter X Hunter
                        )

                    [1] => Array
                        (
                            [id] => 16
                            [name] => Naruto
                        )

                )

        )
)
4

3 に答える 3

2

頑張りすぎ。NAME を配列 KEY として使用し、ksortを使用してキーで並べ替えます

于 2012-11-27T16:38:09.847 に答える
0

問題は、PHPがこれらの数値インデックスをキーとして解釈せず、単なるインデックスであると解釈しないため、ソート後にそれらを保持しないことだと思います。それらを文字列に変換してからソートを実行すると、それらが保持されると思われます。または、数字キーを自分の名前と交換し(もちろん、名前が一意である場合)、単純なksortを実行して(前の回答で提案されているように)、後でそれらを元に戻すこともできます。

于 2012-11-27T16:43:27.337 に答える
0

uksort を使用して、必要なことを実行します。しかし、あなたのデザインには何か問題があります。

@Lukasz Kujawa が言ったように、php 配列は O(1) でアクセスできるように設計されています。あなたの設計は、C 配列として、すべてを O(n) にし、プロセスにステップを追加することを強制します。

uksort を使用して「解決策」を提供しますが、私にとっては良いことではありません。

uksort($categories,function($a,$b)use($categories){
       return return strcmp($categories[$a]["name"], $categories[$b]["name"]);
}
于 2012-11-27T16:44:57.230 に答える