php çok boyutlu dizi yinelenen kaldırmak

5 Cevap php

Bu soru kaldırma ihtiyacı bir çift, ama soran bir gitmek zorundasınız Ben başka bir yerde cevabını bulamadım eğer emin değil.

Ben aşağıdaki gibi görünen bir 2d dizi var:

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

Ben yinelenen e-posta ile bu kaldırmak istiyorum. Yani yukarıdaki örnekte ben sadece kaldırmak istediğiniz ya [] [0] veya [] [2]. Ben isimleri ya da böyle bir şey karşı denetleme konusunda endişeli değilim, ben sadece bir tek değere dayalı deduplicated için alt diziler gerekir.

Şu anda böyle bir şey var

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

ama bu doğru değil. Herhangi bir yardım takdir.

5 Cevap

Dizi indeksler benzersizliğini kullanan hızlı bir çözüm:

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

Uyarı 1: Yukarıdaki gibi görünen bir e-posta adresi için son maç ilk yerine kullanılır. Bu, ile ikinci hat değiştirerek değiştirilebilir

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

Uyarı 2: çıkan dizi indeksleri biraz karışık. Ama bu önemli değil sanırım ...

array_unique() için kullanıcı yorumları bu bir kaç çözüm var. Örneğin

    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.

Çok basit bir çözüm.

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

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

Benim önerim:

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;
}
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));

Daha iyi çalışır ..

Kredi: http://stackoverflow.com/a/946300/736037