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

0voto

Toh Nic Punkte 21

Der richtige Weg, um zu vergleichen, ob zwei Arrays gleich sind, ist die Verwendung von strenger Gleichheit (===), die rekursiv vergleicht. Vorhandene Antworten sind nicht in der Lage, ein beliebiges Array (Array beliebiger Tiefe und Reihenfolge, das eine Mischung aus sequentiellen und assoziativen Arrays enthält) rekursiv zu sortieren und können daher keine Vergleiche beliebiger Arrays verarbeiten. Sequentielle Arrays sind assoziative Arrays mit einem sequentiellen Schlüssel (0,1,2,3...), während assoziative Arrays keinen sequentiellen Schlüssel haben.

Um diese beliebigen Arrays zu sortieren, müssen wir das tun:

  1. Abwärts zu Blattknoten ohne weitere Unterfelder verfahren
  2. Sortieren sequentieller Arrays durch Serialisierung und anschließendes Sortieren (damit keine benutzerdefinierten Komparatoren verwendet werden müssen)
  3. Assoziative Arrays nach Schlüssel sortieren

Der folgende Code implementiert die oben beschriebene Lösung. Verbesserungen des Codes sind willkommen.

function recur_sort( &$array ) {
    foreach ( $array as &$value ) {
       if ( is_array( $value ) ) recur_sort( $value );
    }

    if ( is_sequential_array( $array ) ) {
        $array = array_map( function( $el ) { return json_encode( $el ); }, $array  );
        sort( $array, SORT_STRING );
        $array = array_map( function( $el ) { return json_decode( $el, true ); }, $array  );
        return;
    } else {
        return ksort( $array );
    }
}

function is_sequential_array(Array &$a) {
    $n = count($a);
    for($i=0; $i<$n; $i++) {
        if(!array_key_exists($i, $a)) {
            return false;
        }
    }
    return true;
}

Beispiel (in PHPUnit):

//A stricter and recursive assertEqualsCanonicalizing
public function assertSameCanonicalizing( $expected, $actual ) {
    recur_sort( $expected );
    recur_sort( $actual );
    $this->assertSame( $expected, $actual );
}

0voto

Richard Blažek Punkte 154

Wenn Sie überprüfen wollen, ob Ihre Arrays die streng gleiche ( === ) Verknüpfungen von Schlüsseln und Werten zu erstellen, können Sie die folgende Funktion verwenden:

function array_eq($a, $b) {
    // If the objects are not arrays or differ in their size, they cannot be equal
    if (!is_array($a) || !is_array($b) || count($a) !== count($b)) {
        return false;
    }
    // If the arrays of keys are not strictly equal (after sorting),
    // the original arrays are not strictly equal either
    $a_keys = array_keys($a);
    $b_keys = array_keys($b);
    array_multisort($a_keys);
    array_multisort($b_keys);
    if ($a_keys !== $b_keys) {
        return false;
    }
    // Comparing values
    foreach ($a_keys as $key) {
        $a_value = $a[$key];
        $b_value = $b[$key];
        // Either the objects are strictly equal or they are arrays
        // which are equal according to our definition. Otherwise they
        // are different.
        if ($a_value !== $b_value && !array_eq($a_value, $b_value)) {
            return false;
        }
    }
    return true;
}

-1voto

Wolfgang Leon Punkte 627

Verwenden Sie die php-Funktion array_diff(array1, array2);

Es wird die Differenz zwischen den Arrays zurückgegeben. Wenn sie 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;

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