数组multi_sort asc和中的数字但零值应该是最后一个



这是我的示例代码;

代码正在工作。只是order字段的零值在第一列,应该在最后一列,或者基本上忽略所有零值并放在最后。

array_multisort(array_column($this->products, 'order'), SORT_NUMERIC, SORT_ASC,
array_column($this->products, 'name'), SORT_STRING, SORT_ASC,
$this->products);

如果你更关心效率而不是"干净代码";可以使用usort:

usort($this->products, function($f, $s){
if($f->order === 0 && $s->order !== 0)
return 1;
else if($f->order !== 0 && $s->order === 0)
return -1;
else if($f->order === $s->order){
if($f->name < $s->name) return -1;
else if($f->name === $s->name) return 0;
else return 1;
}
else {
if($f->order < $s->order) return -1;
else if($f->order === $s->order) return 0;
else return 1;
}
});

示例:

$products = [
(object) ['order'=>0, 'name'=>'a'],
(object) ['order'=>1, 'name'=>'a'],
(object) ['order'=>1, 'name'=>'b'],
(object) ['order'=>2, 'name'=>'a'],
(object) ['order'=>3, 'name'=>'a'],
];
usort($products, function($f, $s){
if($f->order === 0 && $s->order !== 0)
return 1;
else if($f->order !== 0 && $s->order === 0)
return -1;
else if($f->order === $s->order){
if($f->name < $s->name) return -1;
else if($f->name === $s->name) return 0;
else return 1;
}
else {
if($f->order < $s->order) return -1;
else if($f->order === $s->order) return 0;
else return 1;
}
});
var_dump($products);

输出:

array(5) {
[0]=>
object(stdClass)#2 (2) {
["order"]=>
int(1)
["name"]=>
string(1) "a"
}
[1]=>
object(stdClass)#3 (2) {
["order"]=>
int(1)
["name"]=>
string(1) "b"
}
[2]=>
object(stdClass)#4 (2) {
["order"]=>
int(2)
["name"]=>
string(1) "a"
}
[3]=>
object(stdClass)#5 (2) {
["order"]=>
int(3)
["name"]=>
string(1) "a"
}
[4]=>
object(stdClass)#1 (2) {
["order"]=>
int(0)
["name"]=>
string(1) "a"
}
}

正如你所看到的,order等于0的那些在的底部

最新更新