php多维数组删除重复

时间:2021-05-18 21:31:10

Not sure if this question is a duplicate in need of removal, but I couldn't find the answer elsewhere so I'll have a go at asking.

不确定这个问题是否需要删除,但我无法在其他地方找到答案,所以我会问一下。

I've got a 2d array that looks as follows:

我有一个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
    )
)

I'd like to remove those with duplicate emails. So in the above example I'd like to just remove either [][0] or [][2]. I'm not worried about checking against names or anything like that, I just need the sub arrays to be deduplicated based on a single value.

我想删除那些带有重复电子邮件的人。所以在上面的例子中,我想删除[] [0]或[] [2]。我并不担心检查名称或类似的东西,我只需要根据单个值对子阵列进行重复数据删除。

At the moment I have something like this

目前我有这样的事情

  if(is_array($array) && count($array)>0){
  foreach ($array as $subarray) {
    $duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]);
    unset($duplicateEmail[$subarray[2]]);
   }
  }

but it just ain't right. Any help appreciated.

但它只是不对。任何帮助赞赏。

7 个解决方案

#1


26  

A quick solution which uses the uniqueness of array indexes:

一种使用数组索引唯一性的快速解决方案:

$newArr = array();
foreach ($array as $val) {
    $newArr[$val[2]] = $val;    
}
$array = array_values($newArr);

Notice 1: As visible from above, the last match for an email address is used instead of the first. This can be changed by replacing the second line with

注意1:从上面可以看到,使用电子邮件地址的最后一个匹配而不是第一个匹配。这可以通过替换第二行来改变

foreach (array_reverse($array) as $val) {

Notice 2: The indexes in the resulting array are somewhat mixed up. But I guess this doesn't matter...

注意2:结果数组中的索引有点混淆。但我想这没关系......

#2


15  

Much Simpler Solution.

更简单的解决方案。

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

echo "<pre>";
print_r($unique);

#3


8  

The user comments for array_unique() have a few solutions to this. For example

对array_unique()的用户注释有一些解决方案。例如

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

from http://uk.php.net/manual/en/function.array-unique.php#57202.

来自http://uk.php.net/manual/en/function.array-unique.php#57202。

#4


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

#5


0  

My proposition:

我的主张:

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;
}

#6


0  

User SORT_REGULAR as second parameter.

用户SORT_REGULAR作为第二个参数。

$uniqueArray = array_unique($array, SORT_REGULAR);

#7


0  

You can use array_column()'s clever key-assignment feature by using null as the second parameter. This assigns new keys to each subarray while leaving the subarray data fully intact. These temporary keys ( element [2] aka "email values") will effectively cause new subarrays with duplicate emails to overwrite previous ones. Once the duplicates are purged, just re-index the array (if necessary) with array_values().

您可以使用null作为第二个参数来使用array_column()的聪明的键分配功能。这为每个子阵列分配新键,同时保持子阵列数据完整无缺。这些临时密钥(元素[2]又名“电子邮件值”)将有效地导致具有重复电子邮件的新子阵列覆盖以前的密钥。清除重复项后,只需使用array_values()重新索引数组(如有必要)。

Code: (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)));

Output:

输出:

array (
  0 => 
  array (
    0 => 'bruce',
    1 => 'finkle',
    2 => 'c@b.c',
  ),
  1 => 
  array (
    0 => 'john',
    1 => 'jones',
    2 => 'a@b.c',
  ),
)

#1


26  

A quick solution which uses the uniqueness of array indexes:

一种使用数组索引唯一性的快速解决方案:

$newArr = array();
foreach ($array as $val) {
    $newArr[$val[2]] = $val;    
}
$array = array_values($newArr);

Notice 1: As visible from above, the last match for an email address is used instead of the first. This can be changed by replacing the second line with

注意1:从上面可以看到,使用电子邮件地址的最后一个匹配而不是第一个匹配。这可以通过替换第二行来改变

foreach (array_reverse($array) as $val) {

Notice 2: The indexes in the resulting array are somewhat mixed up. But I guess this doesn't matter...

注意2:结果数组中的索引有点混淆。但我想这没关系......

#2


15  

Much Simpler Solution.

更简单的解决方案。

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

echo "<pre>";
print_r($unique);

#3


8  

The user comments for array_unique() have a few solutions to this. For example

对array_unique()的用户注释有一些解决方案。例如

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

from http://uk.php.net/manual/en/function.array-unique.php#57202.

来自http://uk.php.net/manual/en/function.array-unique.php#57202。

#4


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

#5


0  

My proposition:

我的主张:

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;
}

#6


0  

User SORT_REGULAR as second parameter.

用户SORT_REGULAR作为第二个参数。

$uniqueArray = array_unique($array, SORT_REGULAR);

#7


0  

You can use array_column()'s clever key-assignment feature by using null as the second parameter. This assigns new keys to each subarray while leaving the subarray data fully intact. These temporary keys ( element [2] aka "email values") will effectively cause new subarrays with duplicate emails to overwrite previous ones. Once the duplicates are purged, just re-index the array (if necessary) with array_values().

您可以使用null作为第二个参数来使用array_column()的聪明的键分配功能。这为每个子阵列分配新键,同时保持子阵列数据完整无缺。这些临时密钥(元素[2]又名“电子邮件值”)将有效地导致具有重复电子邮件的新子阵列覆盖以前的密钥。清除重复项后,只需使用array_values()重新索引数组(如有必要)。

Code: (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)));

Output:

输出:

array (
  0 => 
  array (
    0 => 'bruce',
    1 => 'finkle',
    2 => 'c@b.c',
  ),
  1 => 
  array (
    0 => 'john',
    1 => 'jones',
    2 => 'a@b.c',
  ),
)