2010-12-01 9 views
3

Ich arbeite mit einem mehrdimensionalen Array. Wie kann ich Dubletten nach Wert entfernen? Im folgenden Array haben [0], [2] und [5] die gleiche [ID]. Gibt es eine Funktion, die doppelte Arrays basierend auf einem bestimmten Wert entfernt? In diesem Fall möchte ich Array [2] und Array [5] entfernen, da sie dieselbe [ID] wie Array [0] haben.PHP: Funktion zum Gruppieren von Array von Objekten nach Wert

Vielen Dank für Ihre Informationen.

 Array 
(
    [0] => stdClass Object 
     (
      [d] => 2010-10-18 03:30:04 
      [ID] => 9 
     ) 

    [1] => stdClass Object 
     (
      [d] => 2010-10-18 03:30:20 
      [ID] => 4 
     ) 

    [2] => stdClass Object 
     (
      [d] => 2010-11-03 16:46:34 
      [ID] => 9 
     ) 

    [3] => stdClass Object 
     (
      [d] => 2010-11-02 03:19:14 
      [ID] => 1 
     ) 

    [4] => stdClass Object 
     (
      [d] => 2010-05-12 04:57:34 
      [ID] => 2 
     )  

    [5] => stdClass Object 
     (
      [d] => 2010-05-10 05:24:15 
      [ID] => 9 
     ) 

) 
+0

FYI, Sie verwenden weiterhin den Begriff "Schlüssel", aber Sie Bereich bezieht sich eigentlich auf einen "Wert", kein "Schlüssel". Die von Ihnen erwähnten [0], [2] und [5] sind Schlüssel. Die [ID] ist auch ein Schlüssel. Die 9, die jede dieser IDs enthält, sind alle Werte. –

+0

danke, ich habe die Sprache der Frage geändert. – superUntitled

Antwort

5

Eine Möglichkeit, dies zu tun: ($old_array Ihr Array ist, und $new_array wird die neue enthalten, dupes entfernt, von dieser ID verkeilt)

$new_array = array(); 
foreach ($old_array as $item) 
    if (!array_key_exists($item->ID, $new_array)) 
    $new_array[$item->ID] = $item; 

(ich nicht getestet, aber es sollte Arbeit)

0

Ich denke, es wäre am einfachsten zu durchlaufen und ein neues Array zu konstruieren. Verwenden Sie in der Schleife array_key_exists(), um festzustellen, ob die ID bereits im neuen Array vorhanden ist, und fügen Sie andernfalls ein Element hinzu.

0

Es ist nicht ein mehrdimensionales Array, es ist ein Array von Objekten. Sie können nur eine Schleife über sie (in diesem Beispiel ändert sich die Anordnung an Ort und Stelle):

$ids = array(); 

forach($array as $key=>$obj) { 
    if(isset($ids[$obj->ID])) {//did we already encounter an object with this ID? 
     unset($array[$key]); // if yes, delete this object 
    } 
    else { 
     $ids[$obj->ID] = 1; // if not, add ID to processed IDs 
    } 
} 

Sie können auch ein neues Array erstellen und die Objekte in das neue Array hinzuzufügen.

0
foreach ($array as $element) { 
    foreach ($array as &$element2) { 
     if ($element2->ID == $element->ID && $element2 != $element) { 
      unset($element2); 
     } 
    } 
} 

Beachten Sie die Schleife-durch-Verweis in der zweiten foreach.

0

prüfen indexed Funktion von Nspl.

use function \nspl\op\propertyGetter; 
use function \nspl\a\indexed; 

$groupedById = indexed($objects, propertyGetter('id')); 
Verwandte Themen