PHP - Überprüfen Sie, ob zwei Arrays gleich sind


280

Ich möchte überprüfen, ob zwei Arrays gleich sind. Ich meine: gleiche Größe, gleicher Index, gleiche Werte. Wie kann ich das machen?

!==Ich gehe davon aus, dass bei Verwendung der von einem Benutzer vorgeschlagenen Verwendung die Eingabetaste gedruckt wird , wenn mindestens ein Element in den Arrays unterschiedlich ist, dies jedoch nicht der Fall ist.

if (($_POST['atlOriginal'] !== $oldAtlPosition) 
    or ($_POST['atl'] !== $aext) 
    or ($_POST['sidesOriginal'] !== $oldSidePosition) 
    or ($_POST['sidesOriginal'] !== $sideext)) {

    echo "enter";
}

17
Sie verwenden eine =zu viel, es sollte !==oder!=
jeroen

29
Nur für den Datensatz (da meine Bearbeitung wieder in "ein Benutzer" geändert wurde) ist es "ein Benutzer": english.stackexchange.com/questions/105116/…
teynon

7
['a'] == [0]ist true. Nun, das ist nur PHP.
Dávid Horváth

2
@ DávidHorváth es ist wirklich komisch, eine gute Übung, es immer zu verwenden ===
AFA Med

1
@ DávidHorváth, loser Vergleich ist nicht nur in PHP locker. Wenn Sie sich JS ansehen, werden Sie überrascht sein. Verwenden Sie es nur, bis Sie die Dinge besser verstanden haben.
Ryabenko-Pro

Antworten:


508
$arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs.
$arraysAreEqual = ($a === $b); // TRUE if $a and $b have the same key/value pairs in the same order and of the same types.

Siehe Array-Operatoren .

BEARBEITEN

Der Ungleichungsoperator ist, !=während der Nichtidentitätsoperator !==mit dem Gleichheitsoperator ==und dem Identitätsoperator übereinstimmen soll ===.


79
Eine Randnotiz: Dieser Ansatz funktioniert auch für mehrdimensionale Arrays (für mich war das vorher nicht so offensichtlich).
Trejder

5
PS: Lösung ist zu verwenden array_values($a)==array_values($b)... Ein weiteres übliches Problem sind eindeutige Werte. Denken Sie also daran, dass diese vorhanden sind array_unique().
Peter Krauss

13
Diese Antwort ist falsch. ==funktioniert unabhängig von der Reihenfolge nur für typische Wörterbücher wie [1 => 'a', 2 => 'b']. Zum Beispiel [1 => 'a', 2 => 'b'] == [2 => 'b', 1 => 'a']. Für indizierte Arrays ['a', 'b'] ==funktioniert wie nicht wie angegeben. Zum Beispiel ['a', 'b'] != ['b', 'a'].
Nawfal

37
@nawfal: Deine Annahme ist falsch. ['a', 'b']ist ein Array [0 => 'a', 1 => 'b'], während ['b', 'a']es ein Array ist [0 => 'b', 1 => 'a']. Deshalb haben sie nicht die gleichen Schlüssel / Wert-Paare wie in meiner Antwort angegeben und deshalb ==funktioniert es nicht zwischen diesen.
Stefan Gehrig

29
@StefanGehrig oh du hast recht. Ich werde meinen Kommentar als solchen hinterlassen, um meine Dummheit deutlich zu machen :)
Nawfal

88

Nach dieser Seite .

HINWEIS: Die akzeptierte Antwort funktioniert für assoziative Arrays, funktioniert jedoch nicht wie erwartet mit indizierten Arrays (siehe unten). Wenn Sie einen von beiden vergleichen möchten, verwenden Sie diese Lösung. Diese Funktion funktioniert möglicherweise auch nicht mit mehrdimensionalen Arrays (aufgrund der Art der Funktion array_diff).

Testen von zwei indizierten Arrays, deren Elemente sich in unterschiedlicher Reihenfolge befinden, mit $a == $boder ohne $a === $bFehler, zum Beispiel:

<?php
    (array("x","y") == array("y","x")) === false;
?>

Das liegt daran, dass das oben Genannte bedeutet:

array(0 => "x", 1 => "y")vs. array(0 => "y", 1 => "x").

Verwenden Sie zur Lösung dieses Problems:

<?php
function array_equal($a, $b) {
    return (
         is_array($a) 
         && is_array($b) 
         && count($a) == count($b) 
         && array_diff($a, $b) === array_diff($b, $a)
    );
}
?>

Der Vergleich der Arraygrößen wurde hinzugefügt (von super_ton vorgeschlagen), da dies die Geschwindigkeit verbessern kann.


2
Achtung: funktioniert nicht wie erwartet mit mehrdimensionalen Arrays
Maersu

8
Der obige Kommentar ist falsch. Wenn $ b alle Elemente hat, die $ a hat, plus einige zusätzliche, sind die beiden Arrays nicht gleich, aber der obige Code sagt, dass sie es sind.
Ghola

1
Vielleicht lohnt es sich auch, count ($ a) == count ($ b) hinzuzufügen
stefan

1
@super_ton: Ja, bevor der Anruf array_diffden Vergleich beschleunigen könnte. Ich werde es hinzufügen. Danke
Lepe

3
Leider funktioniert es in einigen Fällen nicht, zum Beispiel habe ich mit dem folgenden Fall getestet $a = [1, 2, 2]; $b = [2, 1, 1];und es wurde zurückgegeben true, aber die beiden Arrays sind offensichtlich nicht gleich.
AwesomeGuy

33

Versuchen Sie, zu serialisieren. Dadurch werden auch verschachtelte Subarrays überprüft.

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";

7
Problematisch, wenn die Tasten und Werte genau wie beim Vergleich verschoben werden. Unter der Annahme, dass sie zu 100% gleich sind, ist dies der sauberste und einfachste Weg, um die tiefe Gleichheit zu überprüfen!
Kevin Peno

1
Ich denke das ist die beste Lösung! Es kann mehrdimensionale und assoziative Arrays vergleichen, wenn sie zuvor sortiert wurden!
Rafael Moni

13

Kurze Lösung, die auch mit Arrays funktioniert, deren Schlüssel in unterschiedlicher Reihenfolge angegeben werden:

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}

3
Wahrscheinlich die bisher beste Antwort. Die meisten Antworten stimmen entweder nicht überein, wenn die Tasten verschoben sind oder wenn es sich um ein mehrdimensionales Array handelt.
AwesomeGuy


9

!===funktioniert nicht, da es sich um einen Syntaxfehler handelt. Der richtige Weg ist !==(nicht drei "gleich" Symbole)


5
if (array_diff($a,$b) == array_diff($b,$a)) {
  // Equals
}

if (array_diff($a,$b) != array_diff($b,$a)) {
  // Not Equals
}

Aus meiner Sicht ist es besser, array_diff als array_intersect zu verwenden, da bei Überprüfungen dieser Art die üblicherweise zurückgegebenen Unterschiede geringer sind als die Ähnlichkeiten. Auf diese Weise ist die Bool-Konvertierung weniger speicherhungrig.

Bearbeiten Beachten Sie, dass diese Lösung für einfache Arrays gilt und die oben angegebenen == und === ergänzt, die nur für Wörterbücher gültig sind.


3

Eine andere Methode zum Überprüfen der Gleichheit unabhängig von der Wertreihenfolge funktioniert mithilfe von http://php.net/manual/en/function.array-intersect.php wie folgt:

$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';
}

Hier ist eine Version, die auch mit mehrdimensionalen Arrays unter Verwendung von http://php.net/manual/en/function.array-uintersect.php funktioniert :

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

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

function compare($v1, $v2) {
    if ($v1===$v2) {
        return 0;
    }
    if ($v1 > $v2) return 1;
    return -1;
}

3

array_diff - Berechnet die Differenz der Arrays

http://php.net/manual/en/function.array-diff.php

array array_diff ( array $array1 , array $array2 [, array $... ] )

Vergleicht array1mit einem oder mehreren anderen Arrays und gibt die Werte zurück array1, die in keinem der anderen Arrays vorhanden sind.


4
Das OP möchte "prüfen, ob zwei Arrays gleich sind". array_diffkann dir das nicht sagen. Versuchen Sie es array_diff([1, 2], [1, 2, 'hello']).
Marcv

3
function compareIsEqualArray(array $array1,array $array):bool
{

   return array_diff($array1,$array2)==[];

}

2
Es ist hilfreich zu erklären, was ein Codebeispiel tut. Funktioniert dies auch für mehrdimensionale Arrays?
k0pernikus

1
array_diff erhält ein anderes Element vom Array, wenn array_diff ein leeres Array zurückgibt. Zwei Arrays sind gleich
dılo sürücü

2

Ein Weg: (Implementierung von 'als gleich angesehen' für http://tools.ietf.org/html/rfc6902#section-4.6 )

Auf diese Weise können assoziative Arrays, deren Mitglieder unterschiedlich geordnet sind, z. B. in jeder Sprache außer PHP als gleich angesehen werden :)

// recursive ksort
function rksort($a) {
  if (!is_array($a)) {
    return $a;
  }
  foreach (array_keys($a) as $key) {
    $a[$key] = ksort($a[$key]);
  }
  // SORT_STRING seems required, as otherwise
  // numeric indices (e.g. "0") aren't sorted.
  ksort($a, SORT_STRING);
  return $a;
}


// Per http://tools.ietf.org/html/rfc6902#section-4.6
function considered_equal($a1, $a2) {
  return json_encode(rksort($a1)) === json_encode(rksort($a2));
}

1
Ich glaube, dass Sie es sein sollten:$a[$key] = rksort($a[$key]);
Pinkeen

2

Syntaxproblem auf Ihren Arrays

$array1 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$diff = array_diff($array1, $array2);

var_dump($diff); 

2

Hier ist das Beispiel, wie Sie mit Arrays vergleichen und herausfinden, was zwischen ihnen unterschiedlich ist.

$array1 = ['1' => 'XXX', 'second' => [
            'a' => ['test' => '2'],
            'b' => 'test'
        ], 'b' => ['no test']];

        $array2 = [
            '1' => 'XX',
            'second' => [
                'a' => ['test' => '5', 'z' => 5],
                'b' => 'test'
            ],
            'test'
        ];


        function compareArrayValues($arrayOne, $arrayTwo, &$diff = [], $reversed = false)
        {
            foreach ($arrayOne as $key => $val) {
                if (!isset($arrayTwo[$key])) {
                    $diff[$key] = 'MISSING IN ' . ($reversed ? 'FIRST' : 'SECOND');
                } else if (is_array($val) && (json_encode($arrayOne[$key]) !== json_encode($arrayTwo[$key]))) {
                    compareArrayValues($arrayOne[$key], $arrayTwo[$key], $diff[$key], $reversed);
                } else if ($arrayOne[$key] !== $arrayTwo[$key]) {
                    $diff[$key] = 'DIFFERENT';
                }
            }
        }

        $diff = [];
        $diffSecond = [];

        compareArrayValues($array1, $array2, $diff);
        compareArrayValues($array2, $array1, $diffSecond, true);

        print_r($diff);
        print_r($diffSecond);

        print_r(array_merge($diff, $diffSecond));

Ergebnis:

Array
(
    [0] => DIFFERENT
    [second] => Array
        (
            [a] => Array
                (
                    [test] => DIFFERENT
                    [z] => MISSING IN FIRST
                )

        )

    [b] => MISSING IN SECOND
    [1] => DIFFERENT
    [2] => MISSING IN FIRST
)

1

Verwenden Sie die PHP-Funktion array_diff (array1, array2).

Es wird der Unterschied zwischen Arrays zurückgegeben. Wenn es leer ist, sind sie gleich.

Beispiel:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3'
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value4'
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print array = (0 => ['c'] => 'value4' ) 

Beispiel 2:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print empty; 

1
Technisch gesehen wird der Unterschied zwischen Arrays nicht zurückgegeben. In der Dokumentation heißt es: "Vergleicht Array1 mit einem oder mehreren anderen Arrays und gibt die Werte in Array1 zurück, die in keinem der anderen Arrays vorhanden sind." Wenn also alle Werte von Array1 in Array2 vorhanden sind, gibt Array_Diff ein leeres Array zurück
2pha

Druckt nicht "null", sondern ein leeres Array (nachdem etwa ein Dutzend Syntaxfehler behoben wurden). Vielleicht könnten Sie verwenden, um (count(array_diff($a1, $a2)) + count(array_diff($a2, $a1))) === 0zu testen, ob Arrays "gleich" sind
user9645

Ich habe die Syntax korrigiert (nicht null ist leer und ich habe Kommas -.- gemischt). Was Sie vorschlagen, finde ich zu viel. Überprüfen, ob ein leeres Array ausreichen sollte.
Wolfgang Leon

1

Wenn Sie nicht assoziative Arrays überprüfen möchten, finden Sie hier die Lösung:

$a = ['blog', 'company'];
$b = ['company', 'blog'];

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.