如何在PHP中按值对对象数组进行排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PHP中按值对对象数组进行排序相关的知识,希望对你有一定的参考价值。

所以我从数据库得到这个结果:

object(IlluminateSupportCollection)#538 (1) {
  ["items":protected]=>
    array(3) {
        [0]=>
        object(stdClass)#536 (3) {
           ["col_header"]=>
           string(7) "other_1"
           ["col_order"]=>
           int(12)
           ["data"]=>
           string(13) "asdgasdgfasdg"
        }
        [1]=>
        object(stdClass)#545 (3) {
           ["col_header"]=>
           string(7) "other_2"
           ["col_order"]=>
           int(10)
           ["data"]=>
           string(10) "dfhgsdhgsd"
       }
       [2]=>
       object(stdClass)#533 (3) {
           ["col_header"]=>
           string(7) "other_3"
           ["col_order"]=>
           int(11)
           ["data"]=>
           string(1) "s"
       }
}

现在,我如何根据col_order的值对其结果进行排序?结果如下:

object(IlluminateSupportCollection)#538 (1) {
  ["items":protected]=>
    array(3) {
        [0]=>
        object(stdClass)#545 (3) {
           ["col_header"]=>
           string(7) "other_2"
           ["col_order"]=>
           int(10)
           ["data"]=>
           string(10) "dfhgsdhgsd"
        }
        [1]=>
        object(stdClass)#533 (3) {
           ["col_header"]=>
           string(7) "other_3"
           ["col_order"]=>
           int(11)
           ["data"]=>
           string(1) "s"
        }
        [2]=>
        object(stdClass)#536 (3) {
           ["col_header"]=>
           string(7) "other_1"
           ["col_order"]=>
           int(12)
           ["data"]=>
           string(13) "asdgasdgfasdg"
        }
}

我在这里尝试过使用asort(),但它似乎只支持关联数组。有什么办法可以把它排除在外吗?

答案

你可以使用usort()

$test = array(array("col_header" => "other_1",
                    "col_order" => 12,
                    "data" => "asdgasdgfasdg"),
              array("col_header" => "other_2",
                    "col_order" => 10,
                    "data" => "dfhgsdhgsd"),
              array("col_header" => "other_3",
                    "col_order" => 11,
                    "data" => "s"));

usort($test, function($a, $b)
             {
                 if ($a["col_order"] == $b["col_order"])
                     return (0);
                 return (($a["col_order"] < $b["col_order"]) ? -1 : 1);
             });

var_dump($test);

输出:

array (size=3)
  0 => 
    array (size=3)
      'col_header' => string 'other_2' (length=7)
      'col_order' => int 10
      'data' => string 'dfhgsdhgsd' (length=10)
  1 => 
    array (size=3)
      'col_header' => string 'other_3' (length=7)
      'col_order' => int 11
      'data' => string 's' (length=1)
  2 => 
    array (size=3)
      'col_header' => string 'other_1' (length=7)
      'col_order' => int 12
      'data' => string 'asdgasdgfasdg' (length=13)

但我建议您直接从SQL查询中对结果进行排序:

SELECT *
FROM yourTable
...
ORDER BY col_order ASC
另一答案

答案是http://php.net/manual/en/function.usort.php - 它通过用户定义的比较函数进行排序。在以下代码段中将a替换为col_order

<?php

$class1 = new stdClass();
$class1->a = 1;
$class2 = new stdClass();
$class2->a = 2;
$class3 = new stdClass();
$class3->a = 3;

$input = [$class3,$class2,$class1];

var_dump($input);

usort($input, function($a, $b) {
      if ($a->a == $b->a) {
        return 0;
    }
    return ($a->a < $b->a) ? -1 : 1;
});

var_dump($input);

https://3v4l.org/9ELKp

当您使用Illuminate时,您可能会想要查看https://laravel.com/api/5.5/Illuminate/Database/Query/Builder.html#method_orderBy并使用它。

从评论中编辑:使用PHP 7+,您可以利用太空船操作员来简化比较功能:

usort($input, function($a, $b) {
    return $a->a <=> $b->a;
});

以上是关于如何在PHP中按值对对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在reactjs / javascript中按值对对象数组进行分组

如何在 JavaScript 中按值对地图进行排序?

在Python中按值对嵌套字典进行排序,并按另一个值对余数进行排序

在python中按值对defaultdict进行排序

在PHP中按数组键的值对字典中的数组进行排序

Firebase 按值对类数组进行排序