【发布时间】:2013-11-21 01:06:29
【问题描述】:
我从数据库数组中得到这样的(用户选择按价格排序):
Array
(
[0] => Array
(
[id] => 812
[price] => 0
[par_id] => 310
)
[1] => Array
(
[id] => 445
[price] => 3400
[par_id] => 0
)
[2] => Array
(
[id] => 1102
[price] => 3500
[par_id] => 0
)
[3] => Array
(
[id] => 310
[price] => 3700
[par_id] => 0
)
[4] => Array
(
[id] => 311
[price] => 3700
[par_id] => 310
)
[5] => Array
(
[id] => 800
[price] => 3900
[par_id] => 310
)
)
我需要将此数组排序为具有 par_id == 0 的项目,并且在它们之下是其子项 child.par_id = parent.id 。要获得具有这些条件的数组,我使用函数 usort():
usort($array, "cmp");
function cmp($a, $b) {
if ( $a['id'] == $b['id'] ) {
return 0;
} else if ( $a['par_id'] ) {
if ( $a['par_id'] == $b['par_id'] ) {
return ( $a['id'] < $b['id'] ? -1 : 1 );
} else {
return ( $a['par_id'] >= $b['id'] ? 1 : -1 );
}
} else if ( $b['par_id'] ) {
return ( $b['par_id'] >= $a['id'] ? -1 : 1);
} else {
return ( $a['id'] < $b['id'] ? -1 : 1 );
}
}
它可以工作,然后我得到这样的数组:
Array
(
[0] => Array
(
[id] => 310
[price] => 3700
[par_id] => 0
)
[1] => Array
(
[id] => 311
[price] => 3700
[par_id] => 310
)
[2] => Array
(
[id] => 800
[price] => 3900
[par_id] => 310
)
[3] => Array
(
[id] => 812
[price] => 0
[par_id] => 310
)
[4] => Array
(
[id] => 445
[price] => 3400
[par_id] => 0
)
[5] => Array
(
[id] => 1102
[price] => 3500
[par_id] => 0
)
)
但是,这个数组不是按价格排序的。我的问题是,是否可以在上述状态下对数组进行排序,但也可以继续按价格排序,至少在父级(在子级也是理想情况)。所以我想得到的结果数组是这样的:
Array
(
[0] => Array
(
[id] => 445
[price] => 3400
[par_id] => 0
)
[1] => Array
(
[id] => 1102
[price] => 3500
[par_id] => 0
)
[2] => Array
(
[id] => 310
[price] => 3700
[par_id] => 0
)
[3] => Array
(
[id] => 812
[price] => 0
[par_id] => 310
)
[4] => Array
(
[id] => 311
[price] => 3700
[par_id] => 310
)
[5] => Array
(
[id] => 800
[price] => 3900
[par_id] => 310
)
)
父级优先,紧随其后的是子级,并且仍然按用户选择的价格排序。
【问题讨论】:
-
你最好使用多数组来做这个,这样会更清楚。
-
你只获取一个父项的子项吗?
-
不,可以有更多的父项和更多的子项,但这只是一层结构。孩子不能有另一个孩子,每个孩子只有一个父母。