【问题标题】:Remove duplicates in array, without using array_unique删除数组中的重复项,而不使用 array_unique
【发布时间】:2017-08-15 18:06:39
【问题描述】:

我需要删除数组中的重复项,但它们并不是完全重复的(所以我不能使用 array_unique)。实际上我需要忽略“重复检查”中的一个字段。在下面的示例中,我希望在检查中忽略“RecipientEmail”,因此我应该删除第三个元素:

Array
(
    [0] => Array
        (
            [RecipientID] => 1
            [RecipientScreenname] => Lau T
            [RecipientFirstname] => TK
            [RecipientEmail] => lau@xx.co.uk
        )

    [1] => Array
        (
            [RecipientID] => 3
            [RecipientScreenname] => Tom L
            [RecipientFirstname] => Thomas
            [RecipientEmail] => info@xx.com
        )        

    [2] => Array
        (
            [RecipientID] => 1
            [RecipientScreenname] => Lau T
            [RecipientFirstname] => TK
            [RecipientEmail] => other@xx.co.uk
        )        

)

有没有办法使用任何原生 PHP 函数来做到这一点?

【问题讨论】:

  • 所以你想删除索引 2 因为索引 0 中的匹配字段?
  • @MinistryofChaps 是的,我想检查所有字段是否匹配但 RecipientEmail
  • @Don'tPanic 是的,不管是什么电子邮件,如果所有其他字段都已经存在,我想从数组中删除该项目
  • 你放弃了吗?
  • @AbraCadaver 实际上我写了一个 foreach 语句删除自己。无论如何,解决方案中有很好的选择,我会接受第一个。

标签: php


【解决方案1】:

没有循环的单线解决方案:

array_filter($list, function($el) use(&$unique) { return isset($unique[$key = "{$el['RecipientID']}-{$el['RecipientScreenname']}-{$el['RecipientFirstname']}"]) ? 0 : ($unique[$key] = 1); });

相同但格式化:

array_filter(
            $list,
            function ($el) use (&$unique) {
                return isset($unique[$key = "{$el['RecipientID']}-{$el['RecipientScreenname']}-{$el['RecipientFirstname']}"]) ? 0 : ($unique[$key] = 1);
            }
        );

【讨论】:

    【解决方案2】:

    我为你写了一个函数。看看这是否有效:

    function make_unique($input, $ignore_column)
    { 
        $input = array_reverse($input);
        $orig = $input; 
        array_walk($input, function (&$v) use ($ignore_column) {
                unset($v[$ignore_column]);
            });
    
        foreach($orig as $index =>$val)
        {
            unset($input[$index]);
            unset($val[$ignore_column]);
            if(in_array($val, $input))
                unset($orig[$index]); 
        } 
    
        return(array_reverse($orig));
    }
    var_dump($input);
    var_dump(make_unique($input, 'RecipientEmail'));
    

    用这样的输入试试这个:

    $input =[
       [
            'RecipientID' => '1',
            'RecipientScreenname' => 'Lau T',
            'RecipientFirstname' => 'TK',
            'RecipientEmail' => 'lau@xx.co.uk'
        ],
        [
            'RecipientID' => '2',
            'RecipientScreenname' => 'Tom hanks L',
            'RecipientFirstname' => 'Thomas',
            'RecipientEmail' => 'info@xx.com',
       ],
        [
            'RecipientID' => '3',
            'RecipientScreenname' => 'Tom L',
            'RecipientFirstname' => 'Thomas',
            'RecipientEmail' => 'info@xx.com',
       ],
        [
            'RecipientID' => '4',
            'RecipientScreenname' => '444',
            'RecipientFirstname' => 'Thomas',
            'RecipientEmail' => 'info@xx.com',
       ],
        [
            'RecipientID' => '2',
            'RecipientScreenname' => 'Tom hanks L',
            'RecipientFirstname' => 'Thomas',
            'RecipientEmail' => 'infsdfsdfo@xx.com',
       ],
       [
            'RecipientID' => '1',
            'RecipientScreenname' => 'Lau T',
            'RecipientFirstname' => 'TK',
            'RecipientEmail' => 'other@xx.co.uk',
        ]  
    ];
    

    【讨论】:

      【解决方案3】:

      只需在RecipientID 上重新索引,您将只有一个。如果你需要第一个使用这个,如果你需要最后一个,那么使用array_reverse($array):

      $result = array_column($array, null, 'RecipientID');
      

      如果RecipientID 不能用于唯一性,那么您可以使用这些值构建一个键。同样,使用这个或array_reverse($array)

      foreach($array as $v) {
          $result[$v['RecipientID'].'-'
                 .$v['RecipientScreenname'].'-'
                 .$v['RecipientFirstname']
                 ] = $v;
      }
      

      如果需要,然后$result = array_values($result)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 2013-11-30
        相关资源
        最近更新 更多