【问题标题】:Disregard both duplicate entries from multidimensional array忽略多维数组中的两个重复条目
【发布时间】:2015-08-28 17:23:23
【问题描述】:

我正在使用一个 API,它可以为员工带回假期数据。数据包含已批准的假期请求以及取消的假期请求。我面临的问题是,取消的假期请求显示为以下格式的重复条目:

stdClass Object
  (
     [leave_requests] => Array
     (
        [0] => stdClass Object
            (
                [employee] => stdClass Object
                    (
                        [id] => 30771
                    )

                [reviewed_by] => stdClass Object
                    (
                        [id] => 22734
                    )

                [reason] => 
                [type] => Holiday
                [deducted] => 1.0
                [cancelled] => 
                [id] => 626214
                [start_date] => 2015-08-20
                [half_start] => 
                [half_start_am_pm] => 
                [end_date] => 2015-08-20
                [half_end] => 
                [half_end_am_pm] => 
                [action] => request
                [status] => approved
                [notes] => 
                [created_at] => 2015-08-06T21:55:12+01:00
                [updated_at] => 2015-08-07T08:26:07+01:00
            )

        [1] => stdClass Object
            (
                [employee] => stdClass Object
                    (
                        [id] => 30771
                    )

                [reviewed_by] => stdClass Object
                    (
                        [id] => 22734
                    )

                [reason] => 
                [type] => Holiday
                [deducted] => 1.0
                [cancelled] => 
                [id] => 632745
                [start_date] => 2015-08-20
                [half_start] => 
                [half_start_am_pm] => 
                [end_date] => 2015-08-20
                [half_end] => 
                [half_end_am_pm] => 
                [action] => cancel
                [status] => approved
                [notes] => 
                [created_at] => 2015-08-12T17:50:32+01:00
                [updated_at] => 2015-08-12T17:53:46+01:00
            )

    )
)

理想情况下,数据将被格式化,以便使用取消的属性,我可以过滤掉它(开发人员已要求这样做)。我想做的是删除两个具有相同 start_date 和 end_date 的条目。

目前我可以使用此功能删除重复项

function super_unique($array)
    {
        $newArr = array();
        foreach ($array as $val) {
            $newArr[$val['startDate']] = $val;
        }
        $array = array_values($newArr);

        return $array;
    }

这有几个问题,因为我仍然留下一个条目,因为假期请求已被取消,我不希望它们中的任何一个出现在数据中。过滤数据以排除所有具有“取消”操作属性的元素仍然会留下原始请求。

另一个问题是上述函数仅基于 start_date 过滤,而不是 start_date 和 end_date。

查看了this SO question 上的 cmets,以及 PHP 文档页面上的 cmets 中的 array_values 和 array_unique。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    我对你当前的代码做了一些小改动,请看代码中的cmets:

    function super_unique($array)
    {
        $newArr = array();
    
        foreach ($array as $val) {
            // Create a key by combining start/end dates 
            $key = $val['startDate'].$val['endDate'];
    
            // Have we already seen this start/end date combination?
            if (array_key_exists($key, $newArr)) {
                $val = null; // Clear element value, like "remove this later on"
            }
            $newArr[$key] = $val; // Add to/update key index (actual value or null)
        }
    
        // Remove all elements with unset (null) values
        $array = array_filter(array_values($newArr));
    
        return $array;
    }
    
    $a = [['startDate' => '2015-08-20', // Exists twice - should be removed
           'endDate'   => '2015-08-22'],
          ['startDate' => '2015-08-20', // Unique start/end combination
           'endDate'   => '2015-08-20'],
          ['startDate' => '2015-08-21', // Unique start/end combination
           'endDate'   => '2015-08-21'],
          ['startDate' => '2015-08-20', // Exists twice - should be removed
           'endDate'   => '2015-08-22'],
          ['startDate' => '2015-08-22', // Unique start/end combination
           'endDate'   => '2015-08-20'],
    ];
    
    print_r(super_unique($a));
    

    输出:

    Array
    (
        [1] => Array
            (
                [startDate] => 2015-08-20
                [endDate] => 2015-08-20
            )
    
        [2] => Array
            (
                [startDate] => 2015-08-21
                [endDate] => 2015-08-21
            )
    
        [3] => Array
            (
                [startDate] => 2015-08-22
                [endDate] => 2015-08-20
            )
    )
    

    【讨论】:

      猜你喜欢
      • 2019-12-14
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      相关资源
      最近更新 更多