【问题标题】:Sort php array and keep the smaller of time duplicated elements对php数组进行排序并保留较小的时间重复元素
【发布时间】:2015-05-13 00:36:42
【问题描述】:

我在 php 中有以下数组 $data。

   Array
    (
        [0] => Array
            (
                [time] => 2014-12-01T00:00:00
                [value] => 0.0107
            )

        [1] => Array
            (
                [time] => 2014-12-01T00:05:35
                [value] => 0.0321
            )

        [2] => Array
            (
                [time] => 2014-12-01T00:05:35
                [value] => 0.0107
            )

        [3] => Array
            (
                [time] => 2014-12-01T00:06:41
                [value] => 0.0535
            )

        [4] => Array
            (
                [time] => 2014-12-01T00:06:41
                [value] => 0.0107
            )

        [5] => Array
            (
                [time] => 2014-12-01T00:13:04
                [value] => 0.0321
            )
)

我使用以下代码对数组的数据进行排序,按日期对它们进行分组:

$sortedData = array();
foreach ($data as $element) {
    $timestamp = strtotime($element['time']);
   $date = date("d.m.Y", $timestamp); 
    if ( ! isSet($sortedData[$date]) ) { 
        $sortedData[$date] = array($element);
    } else { 
        $sortedData[$date][] = $element;
    }
}

所以结果是如下结构:

Array
(
    [01.12.2014] => Array
        (
            [0] => Array
                (
                    [time] => 2014-12-01T00:00:00
                    [value] => 0.0107
                )

            [1] => Array
                (
                    [time] => 2014-12-01T00:05:35
                    [value] => 0.0321
                )

            [2] => Array
                (
                    [time] => 2014-12-01T00:05:35
                    [value] => 0.0107
                )

            [3] => Array
                (
                    [time] => 2014-12-01T00:06:41
                    [value] => 0.0535
                )

            [4] => Array
                (
                    [time] => 2014-12-01T00:06:41
                    [value] => 0.0107
                )
...
)

问题是数组包含时间相同但值不同的元素。有没有办法过滤重复项(时间重复的元素)以便只保留重复项的较小(值)元素?

所以我想要这样的东西(每个元素的索引是时间,值是前一个数组的重复元素中较小的那个):

Array
(
    [01.12.2014] => Array
        (
            [2014-12-01T00:00:00] => Array
                (
                    [time] => 2014-12-01T00:00:00
                    [value] => 0.0107
                )

            [2014-12-01T00:05:35] => Array
                (
                    [time] => 2014-12-01T00:05:35
                    [value] => 0.0107
                )

            [2014-12-01T00:06:41] => Array
                (
                    [time] => 2014-12-01T00:06:41
                    [value] => 0.0107
                )
...
)

任何帮助如何做到这一点?非常感谢!!

【问题讨论】:

  • 您已经完成了一级分组,您只需要再次应用几乎相同的技术按时间而不是日期分组并替换而不是追加。

标签: php arrays sorting date duplicate-removal


【解决方案1】:

这个工作很好,伙计:

$sortedData = array();
        foreach ($data as $element) {
            $timestamp = strtotime($element['time']);
            $date = date("d.m.Y", $timestamp); 
            if ( ! isset($sortedData[$date][$element['time']]) ) { 
                $sortedData[$date][$element['time']] = $element;
$sortedData[$date][$element['time']]['lowest_value'] = $element['value'];
            }
                if ($sortedData[$date][$element['time']]['lowest_value'] >  $element['value']) {
                    $sortedData[$date][$element['time']] = $element;
                    $sortedData[$date][$element['time']]['lowest_value'] =  $element['value'];
                }
        }

如果您想测试,请在此处: http://ideone.com/9W5lbZ

【讨论】:

    【解决方案2】:

    试试这个

    $sortedDataHash = array();
    foreach ($data as $element) {
        $timestamp = strtotime($element['time']);
        if (!isset($sortedDataHash[$timestamp])) {
            $sortedDataHash[$timestamp] = $element;
        } else {
            $sortedDataHash[$timestamp] = $element['value'] < $sortedDataHash[$timestamp]['value']
                ? $element : $sortedDataHash[$timestamp];
        }
    }
    
    $sortedData = array();
    foreach ($sortedDataHash as $key => $val) {
        $date = date("d.m.Y", $key); 
        if ( ! isSet($sortedData[$date]) ) { 
            $sortedData[$date] = array($val);
        } else { 
            $sortedData[$date][] = $val;
        }
    }
    

    可能有更好的方法退出^-^!

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2019-03-12
      • 2013-03-23
      • 1970-01-01
      • 2017-12-16
      相关资源
      最近更新 更多