PHP in_array-Objekt vergleichen?

Lesezeit: 6 Minuten

Benutzer-Avatar
gorgi93

Kann das in_array Funktion Objekte vergleichen?

Zum Beispiel habe ich ein Array von Objekten und möchte sie eindeutig einem anderen Array hinzufügen. Ist es möglich zu überprüfen, ob ein Objekt bereits hinzugefügt wurde, wie folgt:

in_array($distinct, $object);

oder gibt es eine andere möglichkeit?

  • Was ist Ihre Definition von “eindeutig”? Wenn “eindeutig” das Gegenteil von Referenzgleichheit ist, dann einfach weitergeben true wie der dritte Parameter es tun wird.

    – Jon

    21. Juni 2013 um 9:36 Uhr

  • Das funktioniert also mit Objekten im Array?

    – gorgi93

    21. Juni 2013 um 9:37 Uhr

  • Für eine Definition von “Arbeit”. Sie müssen mehr Details angeben, Gedankenlesen ist schwierig.

    – Jon

    21. Juni 2013 um 9:44 Uhr

  • Hilft Ihnen die Antwort auf eine ähnliche Frage?

    – Furgas

    21. Juni 2013 um 9:49 Uhr

  • Was bedeutet eindeutig, es ist unklar, was Sie wollen.

    – Mohammed

    21. Juni 2013 um 10:03 Uhr

Benutzer-Avatar
Alain Timblo

Sie können einen strengen Vergleich verwenden:

in_array($object, $array, TRUE);

Anwendungsbeispiel:

$a = new stdClass();
$a->x = 42;

$b = new stdClass();
$b->y = 42;

$c = new stdClass();
$c->x = 42;

$array = array($a,$b);

echo in_array($a, $array, true); // 1
echo in_array($b, $array, true); // 1
echo in_array($c, $array, true); //

  • Aufgrund des breiten Titels der Frage möchte ich hinzufügen, dass dies nicht funktioniert, wenn Sie ein Objekt aus einer anderen Klasse finden möchten. Nur das Finden genau derselben Instanz eines Objekts funktioniert mit striktem Vergleich.

    – Dan

    3. Mai 2019 um 8:44 Uhr

Benutzer-Avatar
ukliviu

Das in_array Die Funktion kann keine Objekte vergleichen.

Sie sollten eindeutige Schlüssel-Wert-Paare aus Ihren Objekten erstellen und diese Schlüssel nur vergleichen müssen, wenn Sie ein neues Objekt in Ihr endgültiges Array einfügen.

Angenommen, jedes Objekt hat ein Unikat id Eigentum, eine mögliche Lösung wäre:

$unique_objects = array();

// $data represents your object collection
foreach ($data as $item) {
    if (!array_key_exists($item->id, $unique_objects)) {
        $unique_objects[$item->id] = $obj;
    }
}

  • lol was? $idem ist nirgendwo eine Variable und $obj auch nicht? Wie wurde das 13 Mal hochgestimmt?

    – Kristofer Doman

    29. August 2017 um 15:18 Uhr

  • Guter Punkt. Ich habe die Antwort aktualisiert, um das Problem zu beheben $idem Tippfehler. Die Annahme bei diesem Beispielcode ist die $obj stellt einfach eine vorhandene Variable dar, die eindeutig zu hinzugefügt werden muss $unique_objects Reihe.

    – ukliviu

    30. August 2017 um 15:18 Uhr


  • Na sicher in_array Objekte vergleichen kann, genau genommen. Diese Antwort sollte nicht akzeptiert und gelöscht werden, da sie falsche Informationen enthält.

    – Don Callisto

    9. März um 8:42

Benutzer-Avatar
Daan

Ich habe einige Tests durchgeführt, in denen Objekte mit dem verglichen wurden in_array Funktion. Das ist mein Fazit:

Wenn Sie versuchen, die zu finden dieselbe Instanz eines Objekts in einem Array (wie OP), dann in_array könnte mit dem strengen booleschen Vergleichssatz arbeiten.

Wenn Sie versuchen, zu finden jedes Objekt derselben Klasse, aber mit einer anderen Instanz, in_array zeigt kontraintuitives Verhalten.

Da ist ein toller Benutzerkommentar auf PHP.net über die kontraintuitiven Grenzfälle.

// Example array

$array = array(
    'egg' => true,
    'cheese' => false,
    'hair' => 765,
    'goblins' => null,
    'ogres' => 'no ogres allowed in this array'
);

// Loose checking -- return values are in comments

// First three make sense, last four do not

in_array(null, $array); // true
in_array(false, $array); // true
in_array(765, $array); // true
in_array(763, $array); // true
in_array('egg', $array); // true
in_array('hhh', $array); // true
in_array(array(), $array); // true

// Strict checking

in_array(null, $array, true); // true
in_array(false, $array, true); // true
in_array(765, $array, true); // true
in_array(763, $array, true); // false
in_array('egg', $array, true); // false
in_array('hhh', $array, true); // false
in_array(array(), $array, true); // false

Wie Sie das sehen können, ohne das streng zu prüfen in_array Tests 4 – 7 machen keinen Sinn.

Wir von PHP.net kennen dass zwei Objekte sind nur das gleiche im strengen Vergleich (===), wenn sie aus derselben Klasse + Instanz stammen. Zwei Objekte sind schon das gleiche im losen Vergleich (==), wenn sie aus derselben Klasse sind.

Ich habe einige Tests mit Objekten geschrieben, um zu sehen, was passiert.

$a = new stdClass();                              
$a->egg = true;                                   

$b = new stdClass();                              
$b->cheese = false;                               

$c = new stdClass();                              
$c->hair = 765;                                   

$d = new stdClass();                              
$d->goblins = null;                               

$e = new stdClass();                              
$e->ogres="no ogres allowed in this array";     

$array2 = array($a, $b, $c,  $d, $e);         

$e = new stdClass();                                            
$e->egg = null;                                                 

$f = new stdClass();                                            
$f->egg = false;                                                

$g = new stdClass();                                            
$g->egg = 765;                                                  

$h = new stdClass();                                            
$h->egg = 763;                                                  

$i = new stdClass();                                            
$i->egg = 'egg';                                                

$j = new stdClass();                                            
$j->egg = 'hhh';                                                

$k = new stdClass();                                            
$k->egg = array();                                              

in_array($e, $array2, false); // false                
in_array($f, $array2, false); // false                
in_array($g, $array2, false); // true                 
in_array($h, $array2, false); // true                 
in_array($i, $array2, false); // true                 
in_array($j, $array2, false); // true                 
in_array($k, $array2, false); // false                

in_array($e, $array2, true); // false                 
in_array($f, $array2, true); // false                 
in_array($g, $array2, true); // false                 
in_array($h, $array2, true); // false                 
in_array($i, $array2, true); // false                 
in_array($j, $array2, true); // false                 
in_array($k, $array2, true); // false 

Bei den letzten Kontrollen in_array Die Tests 3 – 6 liefern kontraintuitive Ergebnisse.

Der Grund ist wie folgt. Wenn Sie versuchen, ein Objekt mit einem bestimmten Wert zu finden, müssen Sie einen losen Vergleich verwenden (denn wenn die Klasse nicht dieselbe ist, schlägt der strenge Vergleich immer fehl). Aber wegen Variablentypen von PHP, in den letzten Tests werden diese Überprüfungen als wahr angesehen, da der Wert als wahr angesehen wird. Beachten Sie auch, dass der Schlüssel auf dem Objekt im losen Vergleich ignoriert wird.

Sehen http://php.net/manual/en/function.spl-object-hash.php

if ( ! array_key_exists( spl_object_hash( $obj ), $objects ) ) {
    $objects[ spl_object_hash( $obj ) ] = $obj;
}

Prost

Es gibt zahlreiche Möglichkeiten, wie Sie dies tun können, wie Sie sehen können. Ich dachte nur, ich würde noch einen hinzufügen. Ich weiß nicht warum, aber wenn ich mit Objekt-Arrays arbeite, verwende ich gerne die Array-Funktionen, die Callbacks verwenden.

Wenn Ihre Objekte irgendeine Art von Kennung haben, die sie haben sollten, wenn Sie sie auf Duplizierung testen möchten, funktioniert Folgendes:

$found = array_filter($uniqueObjects, function($uniqueObject) use ($object) {
    return $uniqueObject->id == $object->id
});

if (!$found) {
    $uniqueObjects[] = $object;
}

$object ist das Objekt, das Sie suchen, und $uniqueObjects ist das Array von Objekten, nach denen Sie suchen, ob es existiert. Ordnen Sie einfach uniqueObject und object einer identifizierenden Eigenschaft zu, z. B. an id.

Benutzer-Avatar
Wouter Thielen

Ich weiß nicht, ob es an einer neueren PHP-Version liegt, aber in meinem Projekt mit PHP 5.3.16 unter Ubuntu 12.04 hat es funktioniert. Es hat das Nadelobjekt in meinem Array von Objekten gefunden. Ich habe es auch doppelt überprüft, indem ich ein anderes Objekt derselben Klasse geladen und es mit dem Array-Inhalt getestet habe, der dieses Objekt nicht enthielt, und es hat tatsächlich falsch zurückgegeben.

Also ja, in_array Objekte vergleichen können.

Benutzer-Avatar
Justo

Wenn “STRICT” “FALSE” ist, erfolgt der Vergleich durch Umwandeln der Elemente in einen String. Wenn Sie also die magische Funktion __toString überschreiben, sollten Sie verfügbar sein, um die Objektelemente zu vergleichen.

1130300cookie-checkPHP in_array-Objekt vergleichen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy