You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP usort多维数组排序求助:无法按sort键值完成排序

解决usort对多维数组按sort键排序的问题

嘿,我猜你是在写usort的回调函数时卡壳了吧?你的需求很明确:基于每个子数组里的sort键(看起来是时间戳)对多维数组排序,咱们直接上正确的实现,再说说可能踩的坑。

首先,先把你给出的原始数组整理成更清晰的格式:

$array = [
    ['sort' => 1520546956, 'row' => 'Data lives here'],
    ['sort' => 1521047928, 'row' => 'Data lives here'],
    ['sort' => 1520525366, 'row' => 'Data lives here'],
    ['sort' => 1520525227, 'row' => 'Data lives here'],
];

正确的排序实现(PHP7+推荐)

PHP7引入的太空船运算符<=>)让数组排序的回调函数超级简洁,直接比较两个元素的sort值就行:

usort($array, function($a, $b) {
    // 升序排序:小的时间戳在前
    return $a['sort'] <=> $b['sort'];
    // 如果要降序,反过来写:return $b['sort'] <=> $a['sort'];
});

兼容PHP5的写法

如果你的项目还在使用PHP5,就用传统的比较逻辑返回-1/0/1:

usort($array, function($a, $b) {
    if ($a['sort'] == $b['sort']) {
        return 0;
    }
    // 升序:return $a['sort'] < $b['sort'] ? -1 : 1;
    // 降序:return $a['sort'] > $b['sort'] ? -1 : 1;
    return $a['sort'] < $b['sort'] ? -1 : 1;
});

为什么你之前的代码可能出问题?

你提到写了forea...,大概率是误用了循环——usort不需要提前遍历数组,它会自动遍历并调用回调函数比较每一组元素。另外还要注意两个关键点:

  • usort是原地排序,会直接修改原数组,如果需要保留原数组,先复制一份再排序:$sortedArray = $array; usort($sortedArray, ...);
  • 确保所有子数组都有sort键,否则会触发PHP警告,可以在回调里加判断(比如isset($a['sort'], $b['sort'])),避免报错。

排序后的结果(升序)

运行上面的代码后,你的数组会变成按sort值从小到大排列:

Array (
    [0] => Array ( [sort] => 1520525227 [row] => Data lives here )
    [1] => Array ( [sort] => 1520525366 [row] => Data lives here )
    [2] => Array ( [sort] => 1520546956 [row] => Data lives here )
    [3] => Array ( [sort] => 1521047928 [row] => Data lives here )
)

内容的提问来源于stack exchange,提问作者Jason

火山引擎 最新活动