PHP按列名对多维数组进行排序

3
data = [{id: 1, total: 400},{id: 2, total: 100},{id: 3, total: 500},{id: 4, total: 10}]

我该如何按总数对数组进行排序?我尝试获取total字段,但失败了。
foreach($data as $val){
  $d[] = $val['total'];
}
return $d;

我遇到了这个错误。

无法将stdClass对象用作数组


http://brianhaveri.github.io/Underscore.php/ 可以为您完成这项任务。 - Mathieu Nls
为什么你的查询语句中不这样做呢? - Monty
@Monty,我已经这样做了,但是我正在从两个数组中合并,所以最终的数组没有排序。 - Kerwin
1
展示给我带有样例数据的查询,我会进行优化。 - Monty
这是数据...我正在使用 Laravel 4.2 https://gist.github.com/cptsky/b10be56a20966359b42b - Kerwin
2个回答

2

尝试使用usort:如果你仍在使用PHP 5.2或更早版本,则需要首先定义一个排序函数:

$json = '[{"id": 1, "total": 400}, {"id": 2, "total": 100}, {"id": 3, "total": 500}, {"id": 4, "total": 10}]';

    $myArray = json_decode($json, true);
    function sortByOrder($a, $b)
    {
        return $a['total'] - $b['total'];
    }

    usort($myArray, 'sortByOrder');
    print_r($myArray);

从PHP 5.3开始,您可以使用匿名函数:

usort($myArray, function ($a, $b) {
    return $a['total'] - $b['total'];
});

最后,使用PHP 7,您可以使用“太空船运算符”:

usort($myArray, function ($a, $b) {
        return $a['type'] <=> $b['type'];
});

输出:

Array
(
    [0] => Array
        (
            [id] => 4
            [total] => 10
        )

    [1] => Array
        (
            [id] => 2
            [total] => 100
        )

    [2] => Array
        (
            [id] => 1
            [total] => 400
        )

    [3] => Array
        (
            [id] => 3
            [total] => 500
        )

)

1

需要:按 total 属性对对象数组进行排序。

代码:

$json = '[{"id": 1, "total": 400}, {"id": 2, "total": 100}, {"id": 3, "total": 500}, {"id": 4, "total": 10}]';

$data = json_decode($json);

usort($data, function ($t1, $t2) {
        return $t1->total - $t2->total;
    }); 

echo '<pre>';
print_r($data);
echo '</pre>';

输出:

Array
(
    [0] => stdClass Object
        (
            [id] => 4
            [total] => 10
        )

    [1] => stdClass Object
        (
            [id] => 2
            [total] => 100
        )

    [2] => stdClass Object
        (
            [id] => 1
            [total] => 400
        )

    [3] => stdClass Object
        (
            [id] => 3
            [total] => 500
        )
)

我该如何将我的数组从 [{id: 1, total: 100}] 转换为 [{"id": 1, "total": 100}]? - Kerwin
@kerwin,你是怎么生成那个字符串的?你把数据转换成那样的格式是从哪里来的?在PHP中生成JSON字符串的常规方法是使用json_encode($phpDataItem);,其中dataItem是一个PHP数组等。 - Ryan Vincent
我使用Laravel查询生成了数据。 以下是我的代码和说明。https://gist.github.com/cptsky/b10be56a20966359b42b - Kerwin
@Kerwin,好的,我们可以从以下几个方向入手:1)让SQL执行更多的工作来帮助你获取所需的数据并按正确的顺序排序。2)我假设$val保存了你想要排序的数组。如果你使用var_dump($val);,你应该能看到如何对其进行排序。或者,根据你已经创建的查询,它们可以通过使用“union”和“group by”的“sum”进行组合。同时应用“order by”,它应该会返回你想要的数组。 - Ryan Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接