【问题标题】:Sorting a multi-dimensional array based on a consistent array key in PHPPHP中基于一致的数组键对多维数组进行排序
【发布时间】:2022-01-05 01:11:04
【问题描述】:

我正在尝试根据一致的键对多维数组值进行排序。我的数组看起来与此类似,我想按顺序对值进行排序的键是 discipline_one

$data = [
    [
        'id' => 1,
        'score' => 200,
        'results' => [
            'discipline_one' => "4:01"
        ],
    ],
    [
        'id' => 2,
        'score' => 250,
        'results' => [
            'discipline_one' => "3:50"
        ],
    ],
    [
        'id' => 3,
        'score' => 284,
        'results' => [
            'discipline_one' => "3:42"
        ],
    ],
    [
        'id' => 4,
        'score' => 300,
        'results' => [
            'discipline_one' => "4:27"
        ],
    ],
];

在上面的示例中关闭id 键,我的预期输出将按顺序排列:

3, 2, 1, 4

之前,我用score查询:

array_multisort(array_column($data, 'score'), SORT_DESC, $data);

但是,如果 I add an additional array_column 在此为 discipline_one 一致键,那么我得到:

array_multisort(array_column(array_column($data, 'result'), 'discipline_one'), SORT_DESC, $data);

array_multisort(): 数组大小不一致

第三个参数需要相同的数组,在这种情况下这是不可能的。有谁知道我可以做到这一点的方法吗?

【问题讨论】:

  • 您的数组有一个列'results',并且您的代码中有'result' 来提取该列。
  • 这是真的,我把它从我的实际数据中移到了一个更受限的环境中,所以我打错了。该方法仍然会产生问题并且不起作用,所以不,这个问题仍然是可重现的,并且不仅是由错字引起的。 @NigelRen
  • 我刚刚尝试了带有“结果”的代码并得到了我期望的顺序 - 4、1、2、3
  • 用相同的值尝试接受的答案!您正在比较字符串而不是时间。

标签: php arrays sorting


【解决方案1】:

为什么不使用简单的usort

usort($data, fn($a, $b) => ($a['results']['discipline_one'] <=> $b['results']['discipline_one']) * -1);

【讨论】:

  • 感谢您的及时回复。我真的很感激,我没有见过&lt;=&gt;,我一定会调查的!一旦时间允许,我也会接受这个答案。
  • @Jaquarh 那是spaceship operator,但您可以在任何排序功能
  • 测试大数据,我还看到我遇到的问题是由于: 它是一个字符串,所以在使用1:5511:55 时比较非常奇怪。它在1:55 之前显示11:55,因此为此我将删除: 并在检查之前转换为整数。
  • 如果交换 $a 和 $b 回合,您可以避免使用 * -1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多