Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-自定义定义对象数组的顺序,即C1、C2、C3到C2、C1、C3_Php_Arrays - Fatal编程技术网

PHP-自定义定义对象数组的顺序,即C1、C2、C3到C2、C1、C3

PHP-自定义定义对象数组的顺序,即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"]=&

我有一个类似于下面的数组

我需要把这个数组按一定的顺序排序。 例如,如何将“按名称”属性自定义的顺序转换为该顺序C2、C1、C3

   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);
});