基于有序数组

时间:2015-08-10 05:45:08

标签: php arrays sorting multidimensional-array

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

我正在尝试显示显示最近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 个答案:

答案 0 :(得分: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;
        }
    }
});

Demo

答案 1 :(得分: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);