374 Stimmen

PHP - Prüfen, ob zwei Arrays gleich sind

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

Verwendung von !== wie von einem Benutzer vorgeschlagen, erwarte ich, dass das Folgende gedruckt würde eingeben. wenn mindestens ein Element in dem/den Array(s) unterschiedlich ist, was jedoch nicht der Fall ist.

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

    echo "enter";
}

15voto

Emil Vikström Punkte 87499

Vergleichen Sie sie als andere Werte:

if($array_a == $array_b) {
  //they are the same
}

Alle Array-Operatoren können Sie hier nachlesen: http://php.net/manual/en/language.operators.array.php Beachten Sie zum Beispiel, dass === überprüft auch, ob die Typen und die Reihenfolge der Elemente in den Arrays gleich sind.

10voto

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

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

Meiner Meinung nach ist es besser, array_diff als array_intersect zu verwenden, da bei Überprüfungen dieser Art die zurückgegebenen Unterschiede in der Regel geringer sind als die Ähnlichkeiten, so dass die boolsche Konvertierung weniger speicherhungrig ist.

Editar Beachten Sie, dass diese Lösung für einfache Arrays gilt und die oben gepostete Lösung == und === ergänzt, die nur für Dictionaries gültig ist.

9voto

Sodhi saab Punkte 2499

!=== wird nicht funktionieren, weil es sich um einen Syntaxfehler handelt. Der richtige Weg ist !== (nicht drei "gleich"-Symbole)

5voto

whitebrow Punkte 1797

Eine andere Methode zur Überprüfung der Gleichheit unabhängig von der Reihenfolge der Werte funktioniert mit Hilfe von http://php.net/manual/en/function.array-intersect.php , etwa 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';
}

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

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

2voto

Mike McCabe Punkte 995

Eine Möglichkeit: (Umsetzung von "als gleichwertig" für https://www.rfc-editor.org/rfc/rfc6902#section-4.6 )

Dieser Weg erlaubt assoziative Arrays, deren Mitglieder unterschiedlich geordnet sind - z.B. würden sie in jeder Sprache außer php als gleichwertig 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 https://www.rfc-editor.org/rfc/rfc6902#section-4.6
function considered_equal($a1, $a2) {
  return json_encode(rksort($a1)) === json_encode(rksort($a2));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X