不确定这个问题是否需要删除,但我无法在其他地方找到答案,所以我会去询问。
我有一个二维数组,如下所示:
Array
(
[0] => Array
(
[0] => dave
[1] => jones
[2] => c@b.c
)
[1] => Array
(
[0] => john
[1] => jones
[2] => a@b.c
)
[2] => Array
(
[0] => bruce
[1] => finkle
[2] => c@b.c
)
)
我想删除包含重复电子邮件的内容。所以在上面的例子中,我想删除[] [0]或[] [2]。我并不担心检查名称或类似的东西,我只需要根据单个值对子阵列进行重复数据删除。
目前我有这样的事情
if(is_array($array) && count($array)>0){
foreach ($array as $subarray) {
$duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]);
unset($duplicateEmail[$subarray[2]]);
}
}
但这是不对的。任何帮助表示赞赏。
答案 0 :(得分:27)
使用数组索引唯一性的快速解决方案:
$newArr = array();
foreach ($array as $val) {
$newArr[$val[2]] = $val;
}
$array = array_values($newArr);
注意1:从上方可见,使用电子邮件地址的最后一个匹配而不是第一个匹配。这可以通过用
替换第二行来改变foreach (array_reverse($array) as $val) {
注意2:结果数组中的索引有点混淆。但我想这无所谓......
答案 1 :(得分:15)
更简单的解决方案。
$unique = array_map('unserialize', array_unique(array_map('serialize', $array)));
echo "<pre>";
print_r($unique);
答案 2 :(得分:8)
array_unique()的用户评论有一些解决方案。例如
来自http://uk.php.net/manual/en/function.array-unique.php#57202的function multi_unique($array) { foreach ($array as $k=>$na) $new[$k] = serialize($na); $uniq = array_unique($new); foreach($uniq as $k=>$ser) $new1[$k] = unserialize($ser); return ($new1); }
。
答案 3 :(得分:3)
$array = array(
array('dave','jones','c@b.c'),
array('dave','jones','a@c.d'),
array('dave','jones','c@b.c'),
array('dave','jones','e@v.d'),
array('dave','jones','a@c.d')
);
$copy = $array; // create copy to delete dups from
$usedEmails = array(); // used emails
for( $i=0; $i<count($array); $i++ ) {
if ( in_array( $array[$i][2], $usedEmails ) ) {
unset($copy[$i]);
}
else {
$usedEmails[] = $array[$i][2];
}
}
print_r($copy);
答案 4 :(得分:0)
我的主张:
protected function arrayUnique($array, $preserveKeys = false)
{
$uniqueArray = array();
$hashes = array();
foreach ($array as $key => $value) {
if (true === is_array($value)) {
$uniqueArray[$key] = $this->arrayUnique($value, $preserveKeys);
} else {
$hash = md5($value);
if (false === isset($hashes[$hash])) {
if ($preserveKeys) {
$uniqueArray[$key] = $value;
} else {
$uniqueArray[] = $value;
}
$hashes[$hash] = $hash;
}
}
}
return $uniqueArray;
}
答案 5 :(得分:0)
用户SORT_REGULAR作为第二个参数。
$uniqueArray = array_unique($array, SORT_REGULAR);
答案 6 :(得分:0)
您可以使用array_column()
作为第二个参数,使用null
的智能键分配功能。这为每个子阵列分配新键,同时保持子阵列数据完整无缺。这些临时密钥(元素[2]
又名&#34;电子邮件值&#34;)将有效地导致具有重复电子邮件的新子数据覆盖以前的密钥。清除重复项后,只需使用array_values()
重新索引数组(如有必要)。
代码:(Demo)
$array = [
['dave', 'jones', 'c@b.c'],
['john', 'jones', 'a@b.c'],
['bruce', 'finkle', 'c@b.c']
];
var_export(array_values(array_column($array, null, 2)));
输出:
array (
0 =>
array (
0 => 'bruce',
1 => 'finkle',
2 => 'c@b.c',
),
1 =>
array (
0 => 'john',
1 => 'jones',
2 => 'a@b.c',
),
)