PHP-自定义定义对象数组的顺序,即C1、C2、C3到C2、C1、C3
我有一个类似于下面的数组 我需要把这个数组按一定的顺序排序。 例如,如何将“按名称”属性自定义的顺序转换为该顺序C2、C1、C3PHP-自定义定义对象数组的顺序,即C1、C2、C3到C2、C1、C3,php,arrays,Php,Arrays,我有一个类似于下面的数组 我需要把这个数组按一定的顺序排序。 例如,如何将“按名称”属性自定义的顺序转换为该顺序C2、C1、C3 array(11) { [0]=> object(stdClass)#1569 (8) { ["name"]=> string(36) "C1" } [1]=> object(stdClass)#1589 (8) { ["name"]=&
array(11) {
[0]=>
object(stdClass)#1569 (8) {
["name"]=>
string(36) "C1"
}
[1]=>
object(stdClass)#1589 (8) {
["name"]=>
string(36) "C2"
}
[2]=>
object(stdClass)#1599 (8) {
["name"]=>
string(36) "C3"
}
}
在数组中定义自定义顺序
$order = ['C2' => 0, 'C1' => 1, 'C3' => 2];
然后在比较回调中使用该数组,以usort
usort($objects, function($ob1, $ob2) use ($order) {
return $order[$ob1->name] <=> $order[$ob2->name];
});
usort($objects,function($ob1,$ob2)use($order){
返回$order[$ob1->name]$order[$ob2->name];
});
如果某些对象可能没有名称属性,或者它们可能具有自定义顺序中未包含的名称属性,我们可以设置默认值,以便将其中任何一个排序到最后。(这将防止出现“未定义索引”和“未定义属性”通知。)
usort($objects,function($ob1,$ob2)use($order){
退货($order[($ob1->名称??)]??结束($order)+1)
($order[($ob2->名称??)]??结束($order)+1);
});
的可能重复请在发布问题之前搜索StackOverflow上的无数排序
页面。看起来原始数组中有11个对象。您对其余对象的预期行为是什么?把它们留在原来的位置?这是来自mysql结果集吗?json解码字符串?在“翻转”结构中声明$order
查找可以改进建议的code@因为它避免了迭代的array\u search()
调用。如果函数没有动态地传递给usort()
,那么在函数内部使用静态调用$order
可能是一种微观优化——当然,我不知道这是否适用于OP的项目设计。一个好的、干净的答案@Don't我想另一个合理的确认是:是否可能不代表特定的$order
键?我们不希望在$order[$ob->name]
不存在时生成通知。如果这是一个合理的问题,那么isset()
将是必要的,或者将未翻转的查找数组与array\u search()
一起使用也是有意义的。@mickmackusa感谢您的批评。我同意我们不需要通知,但同样重要的是,如果自定义订单中未定义或缺少$ob->name
,则很难预测这些项目的排序顺序。我更新了答案来处理那个案子。
usort($objects, function($ob1, $ob2) use ($order) {
return ($order[($ob1->name ?? '')] ?? end($order) + 1)
<=> ($order[($ob2->name ?? '')] ?? end($order) + 1);
});