【问题标题】:How can I filter an array to include only the most recent items for each id?如何过滤数组以仅包含每个 id 的最新项目?
【发布时间】:2016-08-25 13:10:37
【问题描述】:

我有一个如下的数组:

Array
(
    [0] => Array
        (
            [clearing] => 160000
            [paydate] => 2016-08-03
            [latecharge] => 900
        )
    [1] => Array
        (
            [clearing] => 160000
            [paydate] => 2016-08-04
            [latecharge] => 950
        )
    [2] => Array
        (
            [clearing] => 160001
            [paydate] => 2016-08-05
            [latecharge] => 850
        )
)

我正在尝试保留每个清除的最新paydate 并删除数组的其余部分。

例如,对于清除 160000,最新的 paydate 是 2016-08-04,对于 160001,最新的 paydate 是 2016-08-05,所以我的结果数组应该如下所示:

Array
(
    [1] => Array
        (
            [clearing] => 160000
            [paydate] => 2016-08-04
            [latecharge] => 950
        )
    [2] => Array
        (
            [clearing] => 160001
            [paydate] => 2016-08-05
            [latecharge] => 850
        )
)

我该怎么做?

【问题讨论】:

标签: php arrays multidimensional-array


【解决方案1】:

循环遍历您的数组并按“清除”键进行分组。每次到达结果数组中未设置“清除”的位置时,将其设置为当前实例,或者如果已设置,则在当前实例较新时替换它。

foreach ($clearings as $clearing) {
    $id = $clearing['clearing'];
    if (!isset($latest[$id]) || $latest[$id]['paydate'] < $clearing['paydate']) {
        $latest[$id] = $clearing;
    }
}

@jeroen 的评论提出了一个很好的观点。例如,如果您(或未来的读者)从数据库中获取此数组,则修改查询并在 db.xml 中执行此操作很可能会更有效。这个概念被称为groupwise maximum,有一些很好的答案,有几种不同的方法可以在this question上得到它。

【讨论】:

    【解决方案2】:

    创建一个遍历数组的函数。

    function clearOldPaydates($array)
    {
        $cleaned = array();
        foreach($array as $item)
        {
            // if it's the first item of this date we keep it
            // if there is already an item with this date we only overwrite it if it's older
            if(!isset($cleaned[$item['paydate']])
                || strtotime($item['paydate']] > $cleaned[$item['paydate'])
            {
                $cleaned[$item['paydate']] = $item;
            }
        }
        // we return the array with numeric keys
        return array_values($cleaned);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多