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

使用usort/uasort按sequenceIndex排序PHP关联数组报错求助

按分类sequenceIndex排序关联数组的解决方案

看起来你踩了个常见的小坑——用错了排序函数!咱们先理清楚:你要排序的是$groupedEntries(也就是$category),而这些键的排序依据存在$auditCategories数组里,所以最合适的工具是uksort(),而不是uasort()

uasort()是用来根据数组排序的,回调函数拿到的是两个值,你很难直接对应回它们的$category键;而uksort()专门针对关联数组的排序,回调函数直接接收两个$category键,操作起来就顺畅多了。

正确的实现代码

// 用uksort对$groupedEntries按category对应的sequenceIndex升序排序
uksort($groupedEntries, function($categoryA, $categoryB) use ($auditCategories) {
    // 先处理category不在$auditCategories中的情况,避免报错,把这类放到最后
    $seqA = $auditCategories[$categoryA] ?? PHP_INT_MAX;
    $seqB = $auditCategories[$categoryB] ?? PHP_INT_MAX;
    
    // 升序排列:小的在前;如果要降序,改成return $seqB - $seqA;
    return $seqA - $seqB;
});

为什么你之前可能报错?

我猜大概率是这两个原因:

  1. 作用域问题:你在回调函数里没通过use($auditCategories)把外部数组引入,导致函数里找不到这个变量,报Undefined variable错误。
  2. 用错排序函数:用uasort()的话,回调拿到的是$auditElement值,没法直接拿到对应的$category键,硬要找的话只能用array_search,不仅效率低,还容易因为重复值找错键,自然会报错。

如果非要用uasort怎么办?(不推荐)

实在要坚持的话,得先从值反查键,但这种方式不高效,还容易出问题,仅作参考:

uasort($groupedEntries, function($valA, $valB) use ($groupedEntries, $auditCategories) {
    // 从值反查对应的category键,注意第三个参数true是严格匹配
    $categoryA = array_search($valA, $groupedEntries, true);
    $categoryB = array_search($valB, $groupedEntries, true);
    
    $seqA = $auditCategories[$categoryA] ?? PHP_INT_MAX;
    $seqB = $auditCategories[$categoryB] ?? PHP_INT_MAX;
    
    return $seqA - $seqB;
});

uksort()的方案既简洁又可靠,应该能完美解决你的问题!

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

火山引擎 最新活动