2009-12-07 18 views
15

Nicht sicher, ob diese Frage ein Duplikat ist, das entfernt werden muss, aber ich konnte die Antwort anderswo nicht finden, also werde ich eine Frage stellen.php multidimensionales Array entfernen Duplikat

Ich habe einen 2D-Array bekommt, das sieht wie folgt aus:

Array 
(
[0] => Array 
    (
     [0] => dave 
     [1] => jones 
     [2] => [email protected] 
    ) 

[1] => Array 
    (
     [0] => john 
     [1] => jones 
     [2] => [email protected] 

    ) 

[2] => Array 
    (
     [0] => bruce 
     [1] => finkle 
     [2] => [email protected] 
    ) 
) 

Ich mag würde solche mit doppelten E-Mail löschen. Im obigen Beispiel möchte ich einfach entweder [] [0] oder [] [2] entfernen. Ich mache mir keine Gedanken darüber, ob ich Namen oder ähnliches überprüfen kann. Ich brauche nur die Sub-Arrays, die auf der Grundlage eines einzigen Wertes dedupliziert werden sollen.

Im Moment habe ich so etwas wie diese

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

aber es ist einfach nicht richtig. Jede Hilfe wird geschätzt.

+0

möglich Duplikat von [Wie doppelten Werte aus einem mehrdimensionalen Array in PHP entfernen] (http://stackoverflow.com/questions/307674/how-to-remove-duplicate-values-from-a -multi-dimensional-array-in-php) –

Antwort

25

Eine schnelle Lösung, die die Einzigartigkeit des Array-Indizes verwendet:

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

Hinweis 1: Wie von oben sichtbar, wird das letzte Spiel für eine E-Mail-Adresse anstelle dem ersten verwendet. Die Indizes in der resultierenden Anordnung ist etwas gemischt: Dies kann durch Ersetzen der zweite Zeile mit

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

Hinweis 2 geändert werden. Aber ich denke, das ist egal ...

+0

Ihr 'für' sollte eine 'foreach' aber sein ansonsten klappt es gut, danke. –

+0

du hast vollkommen recht, ich habe das geändert. Danke –

+0

@Cassy - Habe diese Funktion in eine kleine App umgewandelt, die ich gerade programmiere, danke dafür! – Shackrock

7

Die Benutzer-Kommentare für array_unique() haben ein paar Lösungen zu diesem Thema. Zum Beispiel

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

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

+3

das deckt die gesamte sub-array eher als einzelne Werte, wenn ich mich nicht irre –

+0

+1 für die Lösung komplexer Aufgabe – YsoL8

1
$array = array(
    array('dave','jones','[email protected]'), 
    array('dave','jones','[email protected]'), 
    array('dave','jones','[email protected]'), 
    array('dave','jones','[email protected]'), 
    array('dave','jones','[email protected]') 
); 

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

Viel einfachere Lösung.

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

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

Das beantwortet die Frage nicht. Das prüft nur nach eindeutigen Arrays und nicht nach deren Eigenschaften. Schätze, dass du es noch einmal tust. –

+0

Gute Arbeit Dipesh –

+0

@RishabhSeth froh, dass es dir hilft –

0

Mein Vorschlag:

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

Benutzer SORT_REGULAR als zweiten Parameter.

$uniqueArray = array_unique($array, SORT_REGULAR); 
Verwandte Themen