根据电子邮件地址字段从输出中删除所有重复行的最佳方法是什么?
我尝试使用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文件:)
答案 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_key
,array_unique
,array_column
$res = array_intersect_key($arr, array_unique(array_column($arr, 'email')));