【问题标题】:Remove duplicate subarrays based on identifying data respectively retaining the last occurring duplicates根据识别数据删除重复子数组,分别保留最后出现的重复项
【发布时间】:2021-06-21 10:47:27
【问题描述】:

我从 api 查询中获得以下数据,我需要删除具有重复员工 ID 值的数据集并保留最后出现的数据集。

$holiday_array = [
    [
        'employee' => [
            'id' => 456062
        ],
        'reviewed_by' => [
            'id' => 260700
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '11.0',
        'id' => 11505539,
        'start_date' => '2021-03-19',
        'end_date' => '2021-04-02',
        'action' => 'request',
        'status]'=> 'approved',
        'created_at' => '2021-02-22T09:19:57+00:00',
        'updated_at' => '2021-02-23T13:28:41+00:00',
    ],
    [
        'employee' => [
            'id' => 522010
        ],
        'reviewed_by' => [
            'id' => 260760
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '2.0',
        'id' => 11730818,
        'start_date' => '2021-03-19',
        'end_date' => '2021-03-22',
        'action' => 'request',
        'status'=> 'approved',
        'created_at' => '2021-03-10T14:14:48+00:00',
        'updated_at' => '2021-03-15T08:04:36+00:00',
    ],
    [
        'employee' => [
            'id' => 638070
        ],
        'reviewed_by' => [
            'id' => 578193
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '1.0',
        'id' => 11861461,
        'start_date' => '2021-03-22',
        'action' => 'request',
        'status' => 'approved',
        'notes' => 'test',
        'created_at' => '2021-03-22T14:30:33+00:00',
        'updated_at' => '2021-03-22T14:31:39+00:00'
    ],
    [
        'employee' => [
            'id' => 638070
        ],
        'reviewed_by' => [
            'id' => 578193
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '1.0',
        'id' => 11861498,
        'start_date' => '2021-03-22',
        'action' => 'cancel',
        'status' => 'approved',
        'created_at' => '2021-03-22T14:31:55+00:00',
        'updated_at' => '2021-03-22T14:32:26+00:00'
    ],
    [
        'employee' => [
            'id' => 351779
        ],
        'reviewed_by' => [
            'id' => 578193
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '1.0',
        'id' => 11863071,
        'start_date' => '2021-03-22',
        'action' => 'request',
        'status' => 'approved',
        'notes' => 'Test',
        'created_at' => '2021-03-22T15:28:48+00:00',
        'updated_at' => '2021-03-23T14:41:13+00:00'
    ],
    [
        'employee' => [
            'id' => 638070
        ],
        'reviewed_by' => [
            'id' => 578193
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '1.0',
        'id' => 11864185,
        'start_date' => '2021-03-22',
        'action' => 'request',
        'status' => 'approved',
        'notes' => 'test',
        'created_at' => '2021-03-22T16:14:15+00:00',
        'updated_at' => '2021-03-22T16:41:18+00:00'
    ],
    [
        'employee' => [
            'id' => 638070
        ],
        'reviewed_by' => [
            'id' => 578193
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '1.0',
        'id' => 11877400,
        'start_date' => '2021-03-22',
        'action' => 'cancel',
        'status' => 'approved',
        'created_at' => '2021-03-23T14:24:54+00:00',
        'updated_at' => '2021-03-23T14:32:35+00:00'
    ],
    [
        'employee' => [
            'id' => 351779
        ],
        'reviewed_by' => [
            'id' => 578193
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '1.0',
        'id' => 11878419,
        'start_date' => '2021-03-22',
        'action' => 'cancel',
        'status' => 'approved',
        'created_at' => '2021-03-23T15:10:22+00:00'
    ],
    [
        'employee' => [
            'id' => 351779
        ],
        'reviewed_by' => [
            'id' => 578193
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '1.0',
        'id' => 11878445,
        'start_date' => '2021-03-22',
        'action' => 'cancel',
        'status' => 'approved',
        'created_at' => '2021-03-23T15:11:47+00:00'
    ],
    [
        'employee' => [
            'id' => 351779
        ],
        'reviewed_by' => [
            'id' => 578193
        ],
        'reason' => null,
        'type' => 'Holiday',
        'deducted' => '1.0',
        'id' => 11878450,
        'start_date' => '2021-03-22',
        'action' => 'cancel',
        'status' => 'approved',
        'created_at' => '2021-03-23T15:11:53+00:00'
    ]
]

10 组数据中只有 4 组属于唯一的员工 ID,所以我需要以下输出:

Array
(
    [0] => Array
        (
            [employee] => Array
                (
                    [id] => 456062
                )

            [reviewed_by] => Array
                (
                    [id] => 260700
                )

            [reason] => 
            [type] => Holiday
            [deducted] => 11.0
            [id] => 11505539
            [start_date] => 2021-03-19
            [end_date] => 2021-04-02
            [action] => request
            [status] => approved
            [created_at] => 2021-02-22T09:19:57+00:00
            [updated_at] => 2021-02-23T13:28:41+00:00
        )
[1] => Array
    (
        [employee] => Array
            (
                [id] => 522010
            )

        [reviewed_by] => Array
            (
                [id] => 260760
            )

        [reason] => 
        [type] => Holiday
        [deducted] => 2.0
        [id] => 11730818
        [start_date] => 2021-03-19
        [end_date] => 2021-03-22
        [action] => request
        [status] => approved
        [created_at] => 2021-03-10T14:14:48+00:00
        [updated_at] => 2021-03-15T08:04:36+00:00
    )
[6] => Array
    (
        [employee] => Array
            (
                [id] => 638070
            )

        [reviewed_by] => Array
            (
                [id] => 578193
            )

        [reason] => 
        [type] => Holiday
        [deducted] => 1.0
        [id] => 11877400
        [start_date] => 2021-03-22
        [action] => cancel
        [status] => approved
        [created_at] => 2021-03-23T14:24:54+00:00
        [updated_at] => 2021-03-23T14:32:35+00:00
    )
[9] => Array
    (
        [employee] => Array
            (
                [id] => 351779
            )

        [reviewed_by] => Array
            (
                [id] => 578193
            )

        [reason] => 
        [type] => Holiday
        [deducted] => 1.0
        [id] => 11878450
        [start_date] => 2021-03-22
        [action] => cancel
        [status] => approved
        [created_at] => 2021-03-23T15:11:53+00:00
    )

)

所有数组必须按键值[employee][id]排序, 如果不存在具有相同 [employee][id] 的重复数组,则只需输出孤立数组, 如果有例如4个相同的(2,3,5,6),则输出最后一个数组(6)。

我写了这样的循环,但对我来说只推断出工人的 id,我需要推断出这些 id 进入的所有最后一个数组。

for($i = 0; $i < count($holiday_array); $i++) {
    $holiday_arrays[] = $holiday_array[$i]["employee];
    $array[] = array_unique($holiday_arrays[$i], SORT_REGULAR);
}
return $array;

【问题讨论】:

    标签: php arrays filter duplicates last-occurrence


    【解决方案1】:

    由于 php 不允许在数组的任何级别上存在重复键,因此您可以滥用此规则并根据深度员工 id 在结果数组上分配临时的第一级键。完成后只需重新索引结果数组。

    我假设保留原始的第一级密钥没有任何价值。

    您的示例输入过于冗长,因此我将其简化为有意义的部分,以证明最后出现的条目被保留。

    代码:(Demo)

    $holiday_array = [
        ['employee' => ['id' => 456062], 'num' => 1],
        ['employee' => ['id' => 522010], 'num' => 1],
        ['employee' => ['id' => 638070], 'num' => 1],
        ['employee' => ['id' => 638070], 'num' => 2],
        ['employee' => ['id' => 351779], 'num' => 1],
        ['employee' => ['id' => 638070], 'num' => 3],
        ['employee' => ['id' => 638070], 'num' => 4],
        ['employee' => ['id' => 351779], 'num' => 2],
        ['employee' => ['id' => 351779], 'num' => 3],
        ['employee' => ['id' => 351779], 'num' => 4],
    ];
    
    $result = [];
    foreach ($holiday_array as $row) {
        $result[$row['employee']['id']] = $row;
    }
    var_export(array_values($result));
    

    输出:

    array (
      0 => 
      array (
        'employee' => 
        array (
          'id' => 456062,
        ),
        'num' => 1,
      ),
      1 => 
      array (
        'employee' => 
        array (
          'id' => 522010,
        ),
        'num' => 1,
      ),
      2 => 
      array (
        'employee' => 
        array (
          'id' => 638070,
        ),
        'num' => 4,
      ),
      3 => 
      array (
        'employee' => 
        array (
          'id' => 351779,
        ),
        'num' => 4,
      ),
    )
    

    【讨论】:

    • 谢谢你的朋友,但你误解了我,看我上面的回答,我需要一些能在这个原则上起作用的东西
    • @SerhiiSlobodian 这是我的技术适用于您的样本数据的证据。 3v4l.org/gT00Z 如果这不是您想要的,那么您的问题应该以 Unclear 的形式结束。
    • 对不起,我没听懂你的意思,真的你的方法是正确的,而且比解决方案要少得多,今天我将用一个变化的数组运行它,我认为结果会是根据我的需要
    • 你太棒了,一切正常,很抱歉一开始没有理解你,但可以解释循环如何理解有必要推导出键的最后一个值?
    • 当你迭代时,数据被无条件地推入结果数组。每个新数据集都会覆盖具有相同标识值的较早数据集。这是该技术的最简单形式:3v4l.org/pAN9K
    【解决方案2】:

    感谢您的快速响应,但我在数组中的值发生了变化,我以这个为例,所以我得到的每个查询在中间返回不同数量的数组,以及不同数量的相同数组,有时没有完全相同的数组,所以很遗憾它不适合,我已经大致找到了一个解决方案,它看起来像这样:

    $details = get_user_holiday_request_approved();
    $reversed = array_reverse($details);
    function unique_multidim_array($array, $key){
            $temp_array = array();
            $i = 0;
            $key_array = array();
            foreach($array as $val) {
                if (!in_array($val[$key], $key_array)) {
                    $key_array[$i] = $val[$key];
                    $temp_array[$i] = $val;
                }
                ++$i;
            }
            return $temp_array;
        };
        $details_new = unique_multidim_array($reversed,'employee');
    

    但它给我带来了含义为 0、1、2、4 的数组,也就是说,它删除了所有重复值并输出第一个值,但我需要最后一个,我将函数应用于我的数组:

    array_reverse();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      相关资源
      最近更新 更多