Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php多维数组删除重复_Php_Arrays_Multidimensional Array - Fatal编程技术网

php多维数组删除重复

php多维数组删除重复,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我不确定这个问题是否是需要删除的重复问题,但我在别处找不到答案,所以我将尝试提问 我有一个2d数组,如下所示: Array ( [0] => Array ( [0] => dave [1] => jones [2] => c@b.c ) [1] => Array ( [0] => john [1] => jones [2] =>

我不确定这个问题是否是需要删除的重复问题,但我在别处找不到答案,所以我将尝试提问

我有一个2d数组,如下所示:

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]]);
   }
  }
但这是不对的。感谢您的帮助。

的用户评论提供了一些解决方案。比如说

from.

$array=array(
数组('dave','jones','c@b.c'),
数组('dave','jones','a@c.d'),
数组('dave','jones','c@b.c'),
数组('dave','jones','e@v.d'),
数组('dave','jones','a@c.d')   
);
$copy=$array;//创建副本以从中删除DUP
$usedEmails=array();//用过的电子邮件

对于($i=0;$i使用数组索引唯一性的快速解决方案:

$newArr = array();
foreach ($array as $val) {
    $newArr[$val[2]] = $val;    
}
$array = array_values($newArr);
注意1:从上面可以看到,电子邮件地址使用的是最后一个匹配项,而不是第一个匹配项。可以通过将第二行替换为

foreach (array_reverse($array) as $val) {
注意2:结果数组中的索引有些混乱。但我想这没关系…

更简单的解决方案

$unique = array_map('unserialize', array_unique(array_map('serialize', $array)));

echo "<pre>";
print_r($unique);
$unique=array\u-map('unserialize',array\u-unique(array\u-map('serialize',$array));
回声“;
打印(唯一);
我的建议:

$uniqueArray = array_unique($array, SORT_REGULAR);

用户排序规则作为第二个参数

$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)));

通过使用
null
作为第二个参数,您可以使用
array\u column()
的巧妙密钥分配功能。这将为每个子数组分配新密钥,同时保持子数组数据完全完整。这些临时密钥(元素
[2]
又称“电子邮件值”)将有效地导致包含重复电子邮件的新子阵列覆盖以前的子阵列。清除重复邮件后,只需使用
array\u values()
重新索引阵列(如有必要)

代码:()

输出:


它覆盖了整个子数组而不是单个值,如果我没有弄错的话。你的“for”应该是一个“foreach”,但是它工作得很好,谢谢。@Cassy-刚刚在我正在编写的一个小应用程序中为我自己把它变成了一个函数,谢谢!谢谢你,老兄,这样做了。我不知道为什么一开始我错过了这个答案,现在问题解决了!:)这并不能回答问题。这只是检查唯一的数组,而不是它们的属性。感谢您再次尝试。@RishabhSeth很高兴您能帮我移除重复的子阵列。可能是重复的
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;
}
$uniqueArray = array_unique($array, SORT_REGULAR);
$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',
  ),
)