【问题标题】:Sort a multi-dimensional array based on an ordered array基于有序数组对多维数组进行排序
【发布时间】:2015-08-10 05:45:07
【问题描述】:

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

我正在尝试显示一个图表,其中显示了过去 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 中根据需要对其进行排序?

【问题讨论】:

    标签: php arrays sorting multidimensional-array


    【解决方案1】:

    只需将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

    【讨论】:

    • 这很好并且按预期排序,所以谢谢!现在唯一的问题是(我在帖子中没有提到这一点,所以我很抱歉)运行json_encode($data) 返回{"5":{"day":"10","amount":"0","donations":"0"},"2":{"day":"11"...,而需要阅读[{"day":"10"...}]。我猜这是因为数组现在在索引键方面是“无序的”。你有什么想法吗?
    • 对不起,您不能将原始数组与预期输出一起发布
    • 一切都很好。我用echo json_encode(array_values($graph)); 解决了这个问题,幸运的是,它将数组索引重置为连续的。感谢您的帮助!
    • 不客气。很高兴它帮助了你。对于顺序数组索引,如果您需要主索引为0,1,..,只需使用usort
    【解决方案2】:

    你可以用这个:

    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 日。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2010-10-13
    相关资源
    最近更新 更多