通过电子邮件删除重复的数组值

时间:2019-05-20 19:13:28

标签: php arrays

根据电子邮件地址字段从输出中删除所有重复行的最佳方法是什么?

我尝试使用array_unique,但是它删除了太多电子邮件。

输出数组:

$guestOutput[] = [

                    'firstName' => $guest->guestFirstName,
                    'lastName' => $guest->guestLastName,
                    'email' => $guest->guestEmail,
                ];

数组示例:

  [0]=>
  array(3) {
    ["firstName"]=>
    string(5) "T"
    ["lastName"]=>
    string(6) "B"
    ["email"]=>
    string(21) "glh@gmail.com"
  }
  [1]=>
  array(3) {
    ["firstName"]=>
    string(5) "L"
    ["lastName"]=>
    string(7) "Kr"
    ["email"]=>
    string(23) "email1@gmail.com"
  }

我的最终目标是创建一个CSV文件:)

4 个答案:

答案 0 :(得分:1)

如果使用循环添加详细信息(这是我假设当前代码正在执行的操作)的一种简单方法是通过电子邮件地址为$guestOutput编制索引。因此,当您添加新的详细信息时,您只会覆盖之前的详细信息...

$guestOutput[$guest->guestEmail] = [
                    'firstName' => $guest->guestFirstName,
                    'lastName' => $guest->guestLastName,
                    'email' => $guest->guestEmail,
                ];

如果循环末尾不需要索引,则可以使用:

$guestOutput = array_values($guestOutput);

答案 1 :(得分:1)

最好以电子邮件为键构建数组,从而避免重复,但是,如果不能这样做,则使用电子邮件重新索引并消除重复:

$guestOutput = array_column($guestOutput, null, 'email');

根据需要重新索引为整数键:

$guestOutput = array_values(array_column($guestOutput, null, 'email'));

答案 2 :(得分:0)

如上所述,首选选项是在将数据辅助到guesOutput之前更改数据的存储方式。如果您对此没有控制权,则可以使用以下内容。

$aSortedArray = array();
foreach($gustOutput as $iPos => &$a){   
    if(!isset($aSortedArray[$a['email']])){
        $aSortedArray[$a['email']] =& $a;
    }else{
        // handle duplicate
    }
}

答案 3 :(得分:0)

您可以使用array_intersect_keyarray_uniquearray_column

$res = array_intersect_key($arr, array_unique(array_column($arr, 'email')));

Live Demo