テーブル
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
)
)
)
)