我有以下数组与php
// array stored in $items
Array
(
[0] => Array
(
[description] => some text
[value] => 20
)
[1] => Array
(
[description] => bord
[value] => 5
)
[2] => Array
(
[description] => axe
[value] => 99
)
)
我想要的是bord的描述是最后一个元素。我知道php有函数uasort来编写你自己的自定义排序函数。
我尝试的是以下
uasort($items, function($a, $b){
if($a['description'] == 'bord'){
return 0;
}
return ($a['description'] < $b['description']) ? -1 : 1;
});
但无法弄清楚这是如何运作的。
更新 uasort之后的结果
Array
(
[2] => Array
(
[description] => axe
[value] => 99
)
[1] => Array
(
[description] => bord
[value] => 5
)
[0] => Array
(
[description] => some text
[value] => 20
)
)
如果我使用以下uasort:
uasort($items, function($a, $b){
if($a['description'] == 'bord'){
return 1;
}
return -1;
});
结果是正确的,但我从未使用过$ b。
答案 0 :(得分:3)
通过返回0,您告诉它单独留下'bord'项目的位置,并且只有当它是比较中的第一个变量($ a)时。如果你想强迫它到底部,你需要告诉它如何在两种情况下对待'bord'。
uasort($items, function($a, $b){
if($a['description'] == 'bord'){
return 1;
}
if ($b['description'] == 'bord') {
return -1;
}
return ($a['description'] < $b['description']) ? -1 : 1;
});
编辑:为了解释一点,uasort()
在提供的数组中抓取彼此相邻的两个元素,并将它们分配给$ a和$ b变量。当您的比较函数返回正数时,则表示$ a应移至比$ b更低的位置。当它返回负数时,$ a应该高于$ b。当它返回零时,则$ a和$ b相等。
如果我将数组简化为$items = ['some_text', 'bord', 'axe'];
并运行类似的uasort函数,那么步骤将如下所示:
将bord
与some text
进行比较,结果= 1
新订单:['some_text', 'bord', 'axe']
将axe
与bord
进行比较,结果= -1
新订单:['some_text', 'axe', 'bord']
将some text
与axe
进行比较,结果= 1
新订单:['axe', 'some_text', 'bord']
最后一个是最终结果。
答案 1 :(得分:2)
uasort
用于关联数组,但您的数组不是这种情况。您应该使用usort
代替。
usort($items, function($a, $b){
if($a['description'] == 'bord'){
return 1;
}
if($b['description'] == 'bord'){
return -1;
}
return 0;
});
这是如何工作的:你希望description
='bord'的元素是最后一个。这意味着你认为它比其他元素“更大”。如果考虑$ a更大,则必须返回1;如果考虑$ b更大,则返回-1。
这里我们为所有其他情况返回0,这意味着他们的订单将保持不变。
答案 2 :(得分:0)
foreach($items as $key => $thing) {
if(in_array("bord",$key[description])) {
//set aside
$last_description=$key[description];
$last_value=$key[value];
}
$new_array[]=array("description"=>$key[description],"value"=>$key[value];
} //now, add it back on
$new_array[]=array("description"=>$last_description,"value"=>$last_value);
对于更大的数组,这可能会变慢