PHP: controlla se due array sono uguali


280

Vorrei verificare se due array sono uguali. Voglio dire: stessa dimensione, stesso indice, stessi valori. Come lo posso fare?

Utilizzando !==come suggerito da un utente, mi aspetto che il seguente sarebbe stampare entrare se almeno un elemento della matrice (s) sono diversi, ma in realtà non è così.

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

    echo "enter";
}

17
Stai usando =troppo, dovrebbe essere !==o!=
jeroen

29
Solo per la cronaca (da quando la mia modifica è stata ripristinata in "un utente") è "un utente": english.stackexchange.com/questions/105116/…
teynon

7
['a'] == [0]lo è true. Bene, questo è solo PHP.
Dávid Horváth,

2
@ DávidHorváth è davvero strano, una buona pratica da usare sempre ===
AFA Med

1
@ DávidHorváth, il confronto libero è libero non solo in PHP. Se guardi JS rimarrai sorpreso. Basta non usare fino a quando non capisci le cose meglio.
Ryabenko-pro

Risposte:


510
$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.

Vedi Operatori di array .

MODIFICARE

L'operatore di disuguaglianza è !=mentre l' operatore di non identità deve !==abbinare l'operatore di uguaglianza ==e l'operatore di identità ===.


79
Una nota a margine: questo approccio funziona anche per array multidimensionali (non era così ovvio per me prima).
Trejder,

5
PS: la soluzione è usare array_values($a)==array_values($b)... Un altro problema abituale riguarda valori univoci, quindi ricorda che esistono array_unique().
Peter Krauss,

13
Questa risposta è sbagliata ==funziona indipendentemente dall'ordine solo per dizionari tipici come [1 => 'a', 2 => 'b']. Per es [1 => 'a', 2 => 'b'] == [2 => 'b', 1 => 'a']. Per matrici indicizzate come ['a', 'b'] ==non funziona come indicato. Per es ['a', 'b'] != ['b', 'a'].
nawfal,

37
@nawfal: il tuo presupposto è sbagliato. ['a', 'b']è un array [0 => 'a', 1 => 'b'], mentre ['b', 'a']è un array [0 => 'b', 1 => 'a']. Ecco perché non hanno le stesse coppie chiave / valore come indicato nella mia risposta ed è per questo ==che non funziona tra queste.
Stefan Gehrig,

29
@StefanGehrig oh hai ragione. Lascerò il mio commento in quanto tale per rendere evidente la mia follia :)
nawfal

88

Secondo questa pagina .

NOTA: la risposta accettata funziona per gli array associativi, ma non funzionerà come previsto con gli array indicizzati (spiegato di seguito). Se si desidera confrontare uno di essi, utilizzare questa soluzione. Inoltre, questa funzione potrebbe non funzionare con array multidimensionali (a causa della natura della funzione array_diff).

Test di due array indicizzati, quali elementi sono in ordine diverso, utilizzando $a == $bo $a === $bnon riescono, ad esempio:

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

Questo perché quanto sopra significa:

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

Per risolvere il problema, utilizzare:

<?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)
    );
}
?>

È stato aggiunto il confronto delle dimensioni degli array (suggerito da super_ton) in quanto potrebbe migliorare la velocità.


2
Attenzione: non funziona come previsto con gli array multidimensionali
maersu

8
Il commento sopra è falso. Se $ b ha tutti gli elementi $ a ha più alcuni extra, i due array non sono uguali, ma il codice sopra dice che lo sono.
Ghola,

1
potrebbe valere la pena aggiungere anche count ($ a) == count ($ b)
stefan

1
@super_ton: sì, prima di chiamare è array_diffpossibile velocizzare il confronto. Lo aggiungerò. Grazie
lepe

3
Sfortunatamente, in alcuni casi non funziona, ad esempio, ho provato con il caso seguente $a = [1, 2, 2]; $b = [2, 1, 1];e ha restituito true, ma i due array ovviamente non sono uguali.
Fantastico

33

Prova a serializzare. Questo controllerà anche i subarray nidificati.

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

7
Problematico se le chiavi e i valori vengono spostati come nel confronto. Tuttavia, supponendo che dovrebbero essere uguali al 100%, questo è il modo più semplice e pulito per verificare l'uguaglianza profonda!
Kevin Peno,

1
Immagino che questa sia la soluzione migliore! Può confrontare array multidimensionali e associativi se sono stati precedentemente ordinati!
Rafael Moni,

13

Soluzione breve che funziona anche con le matrici quali chiavi sono fornite in ordine diverso:

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

3
Probabilmente la risposta migliore finora, la maggior parte delle risposte o non corrispondono se i tasti vengono spostati o se si tratta di un array multidimensionale.
Fantastico


9

!===non funzionerà perché è un errore di sintassi. Il modo corretto è !==(non tre simboli "uguali a")


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

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

Dal mio punto di vista è meglio usare array_diff che array_intersect perché con i controlli di questa natura le differenze restituite comunemente sono inferiori alle somiglianze, in questo modo la conversione bool ha meno fame di memoria.

Modifica Si noti che questa soluzione è per array semplici e integra quella == e === pubblicata sopra che è valida solo per i dizionari.


4

array_diff - Calcola la differenza di array

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

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

Confronta array1con uno o più altri array e restituisce i valori array1che non sono presenti in nessuno degli altri array.


4
L'OP vuole "verificare se due array sono uguali". array_diffnon posso dirtelo. Prova array_diff([1, 2], [1, 2, 'hello']).
marcv,

3

Un altro metodo per controllare l'uguaglianza indipendentemente dall'ordine dei valori funziona usando http://php.net/manual/en/function.array-intersect.php , in questo modo:

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

Ecco una versione che funziona anche con array multidimensionali usando 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;
}

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

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

}

2
È utile spiegare cosa sta facendo un esempio di codice. Funziona anche con array multidimensionali?
k0pernikus,

1
array_diff ottiene un elemento diverso dall'array se array_diff restituisce un array vuoto due array è uguale
dılo sürücü

2

Un modo: (implementando "considerato uguale" per http://tools.ietf.org/html/rfc6902#section-4.6 )

In questo modo consente matrici associative i cui membri sono ordinati in modo diverso - ad esempio, sarebbero considerati uguali in tutte le lingue ma php :)

// 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
Credo che dovresti essere:$a[$key] = rksort($a[$key]);
pizzicato l'

2

Problema di sintassi sugli array

$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

Ecco l'esempio di come confrontare gli array e ottenere ciò che è diverso tra loro.

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

Risultato:

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

        )

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

1

Usa la funzione php array_diff (array1, array2);

Restituirà la differenza tra le matrici. Se è vuoto, sono uguali.

esempio:

$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' ) 

Esempio 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
Tecnicamente, non restituisce la differenza tra array. La documentazione afferma "Confronta array1 con uno o più altri array e restituisce i valori in array1 che non sono presenti in nessuno degli altri array.". Quindi, se tutti i valori di array1 sono presenti in array2, anche se array2 ha più valori, array_diff restituirà un array vuoto
2pha

Non "stampa null", stampa un array vuoto (dopo aver corretto una dozzina di errori di sintassi). Forse potresti usare (count(array_diff($a1, $a2)) + count(array_diff($a2, $a1))) === 0per verificare se gli array sono "uguali"
user9645

Ho corretto la sintassi (non null è vuoto e stavo mescolando le virgole -.-). Quello che stai proponendo penso sia troppo. Verifica se è un array vuoto dovrebbe essere sufficiente.
Wolfgang Leon,

1

Se vuoi controllare array non associativi, ecco la soluzione:

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

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.