根据一个有序数组对多维数组进行排序。

4

这似乎是一本书中最古老的问题,并且有数百个可用的资源,但到目前为止,我尝试过的每个解决方案都没有解决我的问题。我希望你能帮忙。

我正在尝试显示一个图表,显示最近31天的数据。输出的数组看起来像这样:

$data[
    0 =>
       'day' => 10,
       'amount' => 5,
       'count' => 2
    1 =>
       'day' => 16,
       'amount' => 4,
       'count' => 2
    2 =>
       'day' => 21,
       'amount' => 16,
       'count' => 1
    3 =>
       'day' => 11,
       'amount' => 0,
       'count' => 0
    4 =>
       'day' => 12,
       'amount' => 0,
       'count' => 0
]

本质上,这个数组由两部分组成。前3个内部数组是包含金额和计数的日期,剩余的27天则是任何未核算的日期,它们的金额和计数都设为0。例如,$data[5]将是第13天,$data[21]是第31天。$data[22]将等于第1天,一直到第9天,因此显示最近31天的数据。

此外,还有一个按顺序排列的日期数组需要输出。

$days[
    0 =>
        'day' => 10
    1 =>
        'day' => 11
    2 =>
        'day' => 12
    ...
    30 =>
        'day' => 9
]

我已经尝试了以下方法,虽然$data现在被排序,但它本质上只是$days的副本,失去了$data中保存的其他值。
$data = array_uintersect($days, $data, array($this, 'compare_days'));

function compare_days($order, $array) {
    return strcmp($order['day'], $array['day']);
}  

最近怎么样?我该如何对$data进行排序,以便在$days所需的顺序下保留数据?

2个回答

3

只需使用uasort函数即可。

uasort($data, function($a,$b) use ($days){
    foreach($days as $value){
        if($a['day'] == $value['day']){
            return 0;
            break;
        }
        if($b['day'] == $value['day']){
            return 1;
            break;
        }
    }
});

演示


这很好,并且按预期进行排序,所以谢谢您!现在唯一的问题是(我在帖子中没有提到过,所以请原谅)运行json_encode($data)返回{"5":{"day":"10","amount":"0","donations":"0"},"2":{"day":"11"... ,而应该读取[{"day":"10"...}]。 我猜测这是因为数组现在在索引键方面是“无序”的。您有任何想法吗? - J Young
抱歉,我不能理解你的意思。能否请您提供原始数组及期望输出? - Narendrasingh Sisodia
一切都好。我用 echo json_encode(array_values($graph)); 解决了问题,幸运的是它重置了数组索引为连续的值。感谢您的帮助! - J Young
1
不用谢。很高兴能帮到你。如果您需要主索引为0,1,..,也可以使用usort来处理连续的数组索引。 - Narendrasingh Sisodia

0
你可以使用这个:
foreach ($data as $key => $row) {
    $days[$key]  = $row['day'];
    $amount[$key] =  $row['amount'];
}

array_multisort($days, SORT_ASC, $amount, SORT_ASC, $data);

print_r($data);

这将按照日期升序排序(1到31)。实际上,日期从7月10日开始(8月10日-31天),然后逐渐回到8月10日。 - J Young

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