Prüfen, ob zwei Arrays die gleichen Werte haben (unabhängig von der Wertereihenfolge) [duplicate]

Lesezeit: 6 Minuten

Benutzeravatar von Anna K
Anna K.

[2,5,3]    

[5,2,3]

Sie sind gleich, weil sie die gleichen Werte haben, aber nicht in der gleichen Reihenfolge.

Kann ich das herausfinden, ohne a foreach() Schleife mit in_array()? Ich glaube nicht, dass es effizient wäre.

  • array_diff() ist nicht perfekt. sortieren und dann die besten vergleichen.

    – Suresh Kamrushi

    15. Januar 2014 um 13:28 Uhr

  • @jeroen: Führen Sie Folgendes aus:`$array = array(4,3); $array2 = array(2,3,4); echo var_dump(array_diff($array,$array2));’

    – Suresh Kamrushi

    15. Januar 2014 um 13:30 Uhr

  • @SureshKamrushi Schön!

    – jeroen

    15. Januar 2014 um 13:32 Uhr

  • also funktioniert array_diff nicht?

    – Anna K.

    15. Januar 2014 um 17:05 Uhr

  • Zum Zeitpunkt, an dem ich dies schreibe, funktioniert keine der angegebenen Lösungen tatsächlich. Alle von ihnen scheitern mit booleschen Werten.

    – Jay Bienvenu

    30. April 2018 um 22:22 Uhr

Benutzeravatar von user1844933
Benutzer1844933

sort($a);
sort($b);
if ($a===$b) {//equal}

  • Die Sortierfunktion hat einen Nebeneffekt beim Sortieren der Daten. Wenn Sie also die ursprüngliche Reihenfolge beibehalten möchten, müssen Sie eine Kopie davon in $a und $b erstellen, bevor Sie diese verwenden.

    – Strahl

    1. September 2017 um 19:29 Uhr


  • Ich würde diese Antwort nicht akzeptieren. Gibt wahr für zurück ['a'] und [true].

    – Jay Bienvenu

    30. April 2018 um 22:03 Uhr

  • Beachten Sie, dass das Testen von sort($a) == sort($b) immer true zurückgibt, ich nehme an, weil PHP die Rückgabe von sort() mit wahrscheinlich 1 überprüft, anstatt sich die Arrays anzusehen.

    – Silikonrockstar

    24. November 2018 um 17:24 Uhr


  • Es ist nicht die beste Antwort, die Sortierung wirkt sich auf die Array-Werte aus. Es funktioniert nicht in allen Fällen

    – Ali Akbar Azizi

    6. Februar 2019 um 20:33 Uhr

  • @JayBienvenu Getestet mit diesem Fall === Anstatt von ==, ['a'] und [true] gibt falsch zurück.

    – Cameron Wilby

    19. April 2019 um 14:20 Uhr

Benutzeravatar von Conor Mancone
Conor Mancone

Ich komme zu spät zu dieser Party. Ich hatte die gleiche Frage, wollte aber nicht sortieren, was die sofortige Antwort war, von der ich wusste, dass sie funktionieren würde. Ich habe mir diesen einfachen Einzeiler ausgedacht was nur für Arrays mit eindeutigen Werten funktioniert:

$same = ( count( $a ) == count( $b ) && !array_diff( $a, $b ) )

Es ist auch etwa um den Faktor 5 schneller als die Sortieroption. Nicht, dass beides besonders langsam ist, also würde ich sagen, es geht mehr um Ihre persönlichen Vorlieben und welche Sie für klarer halten. Ich persönlich würde lieber nicht sortieren.

Bearbeiten: Danke Ray für den Hinweis, dass dies nur mit Arrays mit eindeutigen Werten funktioniert.

  • Ich denke, dies ist die beste Antwort. Die akzeptierte Antwort hinterlässt einen Nebeneffekt der tatsächlichen Sortierung der Arrays $a und $b, die Sie möglicherweise nicht möchten.

    – Strahl

    1. September 2017 um 19:26 Uhr

  • Bei genauerer Betrachtung scheint dies nicht in jedem Fall zu funktionieren, da array_diff mehrere Ergebnisse zu einem zusammenfasst. Das scheint vorüberzugehen. $ ein = [‘red’,’red’,’blue’,’blue’]; $ b = [‘red’,’red’,’red’,’blue’];

    – Strahl

    1. September 2017 um 19:47 Uhr


  • Gibt wahr für zurück [true] und [1].

    – Jay Bienvenu

    30. April 2018 um 22:07 Uhr

  • In der Tat @JayBienvenu, viele PHP-Funktionen sind nicht streng in Bezug auf Typen. Es ist sicherlich eine hilfreiche Anmerkung hinzuzufügen, da es gelegentlich Anwendungsfälle geben kann, in denen es wichtig ist, aber wenn man bedenkt, dass PHP standardmäßig effektiv lose typisiert ist, liegt das einfach in der Natur des Biests. Es hat keinen Sinn, etwas anderes vorzutäuschen. Sie suchen keine andere Lösung, Sie suchen eine andere Sprache.

    – Conor Mancone

    1. Mai 2018 um 20:43 Uhr


  • @JayBienvenu kurz gesagt, es gibt nie nur eine Antwort. Programmieren ist immer ein Balanceakt, und ich glaube nicht, dass es viel Sinn macht, wenn Sie hierher kommen und alle Antworten dafür kritisieren, dass sie in einer Sprache, die standardmäßig keine exakte Typübereinstimmung bietet, keine exakte Typübereinstimmung bieten. Ob Sie es erkennen oder nicht, Sie beschweren sich über PHP, keine der Antworten hier, und das hilft niemandem wirklich. Wenn Sie die genaue Typübereinstimmung ernst nehmen, sollten Sie eine Antwort posten, die diese Genauigkeit liefert – tatsächlich benötigen andere sie möglicherweise, daher wäre es gut zu sehen.

    – Conor Mancone

    3. Mai 2018 um 16:04 Uhr

Dies ist ein bisschen spät für die Party, aber in der Hoffnung, dass es nützlich sein wird:

Wenn Sie sicher sind, dass die Arrays beide nur Strings oder beide nur Integer enthalten, dann array_count_values($a) == array_count_values($b) hat eine bessere Zeitkomplexität. Die Antwort von user1844933 ist jedoch allgemeiner.

  • Dies schlägt fehl, wenn es einen Konflikt in den Ganzzahlen gibt (was bedeutet, dass der erste Wert -1 und der zweite +1 hat), der berechnete Wert ist gleich beiden Arrays, aber es sind unterschiedliche Arrays.

    – irgendwie

    4. August 2017 um 10:05 Uhr

  • @kindaian bitte demonstrieren wann array_count_values() kann möglicherweise einen negativen Wert erzeugen.

    – mickmackusa

    12. April 2019 um 2:20 Uhr

Benutzeravatar von whitebrow
Weißbraue

Wenn Sie Arrays nicht sortieren möchten, sondern nur die Gleichheit unabhängig von der Verwendung der Wertereihenfolge überprüfen möchten http://php.net/manual/en/function.array-intersect.php so:

$array1 = array(2,5,3);
$array2 = array(5,2,3);
if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

Der beste Weg wird die Verwendung sein array_diff http://php.net/manual/en/function.array-diff.php

$arr1 = [2,5,3];
$arr2 = [5,2,3];

$isEqual = array_diff($arr1,$arr2) === array_diff($arr2,$arr1);

  • Diese Lösung berücksichtigt keine Wiederholung von Elementen. z.B: [2,5,3] & [5,2,3,3] wäre nach obiger Logik gleich. 3v4l.org/1SRp7

    – Liebesina

    1. Juli 2019 um 8:16 Uhr

  • Ich habe es schließlich getan array_diff($arr1, $arr2) === array_diff($arr2, $arr1) && count($arr1) === count($arr2)

    – Chris

    28. Januar 2021 um 10:56 Uhr

  • @Chris, das wird dir immer noch ein falsches Positiv geben [2,2,1] und [1,1,2]

    – Georg Dimitriadis

    5. April 2021 um 15:26 Uhr

Da keine der angegebenen Antworten, die vollständig schlüsselunabhängig sind, mit doppelten Werten (wie [1,1,2] gleich [1,2,2]) Ich habe meine eigene geschrieben.

Diese Variante funktioniert nicht mit mehrdimensionalen Arrays. Es überprüft, ob zwei Arrays genau die gleichen Werte enthalten, unabhängig von ihren Schlüsseln und ihrer Reihenfolge, ohne eines der Argumente zu ändern.

function array_equals(array $either, array $other) : bool {
    foreach ($other as $element) {
        $key = array_search($element, $either, true);
        if ($key === false) {
            return false;
        }
        unset($either[$key]);
    }
    return empty($either);
}

Obwohl die Frage nach einer foreach-freien Variante gestellt wurde, konnte ich keine Lösung finden, die meine Anforderungen ohne Schleife erfüllt. Außerdem verwenden die meisten der sonst verwendeten Funktionen auch intern eine Schleife.


Warum ändert es sich nicht $either? Da Werte in PHP Copy-on-Write sind, also solange dies seine eigene Funktion ist und nicht Inline-Code wird das Array einmal kopiert $either Argument wird zum ersten Mal geändert.

Wenn Sie diesen Code einfügen möchten, tun Sie dies vorher:

$either = $myarray;
// inline code from function above

  • Diese Lösung berücksichtigt keine Wiederholung von Elementen. z.B: [2,5,3] & [5,2,3,3] wäre nach obiger Logik gleich. 3v4l.org/1SRp7

    – Liebesina

    1. Juli 2019 um 8:16 Uhr

  • Ich habe es schließlich getan array_diff($arr1, $arr2) === array_diff($arr2, $arr1) && count($arr1) === count($arr2)

    – Chris

    28. Januar 2021 um 10:56 Uhr

  • @Chris, das wird dir immer noch ein falsches Positiv geben [2,2,1] und [1,1,2]

    – Georg Dimitriadis

    5. April 2021 um 15:26 Uhr

Angenommen, Sie haben zwei Arrays wie folgt definiert:

$array1 = array(2,5,3);
$array2 = array(5,2,3);

Dann können Sie diesen Codeabschnitt verwenden, um zu beurteilen, ob sie gleich sind:

if(array_diff($array1,$array2) === array_diff($array2,$array1) &&count($array1)==count($array2))
{
    echo 'Equal';
}
else
{
    echo 'Not equal';
}

  • Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu

    – El.Hum

    9. Dezember 2019 um 9:39 Uhr

1435840cookie-checkPrüfen, ob zwei Arrays die gleichen Werte haben (unabhängig von der Wertereihenfolge) [duplicate]

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

Privacy policy