PHP - Periksa apakah dua array sama

280

Saya ingin memeriksa apakah dua array sama. Maksud saya: ukuran yang sama, indeks yang sama, nilai yang sama. Bagaimana saya bisa melakukan itu?

Menggunakan !==seperti yang disarankan oleh pengguna, saya berharap bahwa yang berikut ini akan mencetak masuk jika setidaknya satu elemen dalam array (s) berbeda, tetapi pada kenyataannya tidak.

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

    echo "enter";
}
markzzz
sumber
17
Anda menggunakan =terlalu banyak, seharusnya !==atau!=
jeroen
29
Sekadar catatan (karena edit saya diubah kembali menjadi "pengguna") itu adalah "pengguna": english.stackexchange.com/questions/105116/…
teynon
7
['a'] == [0]adalah true. Ya, ini baru PHP.
Dávid Horváth
2
@ DávidHorváth ini benar-benar aneh, praktik yang baik untuk selalu digunakan ===
AFA Med
1
@ DávidHorváth, perbandingan longgar tidak hanya longgar di PHP. Jika Anda melihat JS Anda akan terkejut. Hanya saja jangan gunakan sampai Anda memahami hal-hal yang lebih baik.
ryabenko-pro

Jawaban:

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.

Lihat Operator Array .

EDIT

Operator ketidaksetaraan adalah !=sementara operator non-identitas adalah !==untuk mencocokkan operator kesetaraan ==dan operator identitas ===.

Stefan Gehrig
sumber
79
Catatan tambahan: Pendekatan ini juga berfungsi untuk array multidimensi (tidak terlalu jelas bagi saya sebelumnya).
trejder
5
PS: solusinya adalah menggunakan array_values($a)==array_values($b)... Masalah lain yang biasa adalah tentang nilai-nilai unik, jadi ingatlah bahwa ada array_unique().
Peter Krauss
13
Jawaban ini salah. ==berfungsi terlepas dari urutan hanya untuk kamus khas seperti [1 => 'a', 2 => 'b']. Untuk misalnya [1 => 'a', 2 => 'b'] == [2 => 'b', 1 => 'a']. Untuk array yang diindeks seperti ['a', 'b'] ==tidak berfungsi seperti yang dinyatakan. Untuk misalnya ['a', 'b'] != ['b', 'a'].
nawfal
37
@nawfal: Asumsi Anda salah. ['a', 'b']adalah array [0 => 'a', 1 => 'b'], sedangkan ['b', 'a']array [0 => 'b', 1 => 'a']. Itu sebabnya mereka tidak memiliki pasangan kunci / nilai yang sama seperti yang dinyatakan dalam jawaban saya dan itulah mengapa ==tidak bekerja di antara mereka.
Stefan Gehrig
29
@StefanGehrig oh Anda benar. Saya akan meninggalkan komentar saya untuk membuat kebodohan saya menjadi jelas :)
nawfal
88

Menurut halaman ini .

CATATAN: Jawaban yang diterima berfungsi untuk array asosiatif, tetapi tidak akan berfungsi seperti yang diharapkan dengan array yang diindeks (dijelaskan di bawah). Jika Anda ingin membandingkan keduanya, maka gunakan solusi ini. Juga, fungsi ini mungkin tidak berfungsi dengan array multidimensi (karena sifat fungsi array_diff).

Menguji dua array yang diindeks, elemen mana yang berbeda, menggunakan $a == $batau $a === $bgagal, misalnya:

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

Itu karena di atas berarti:

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

Untuk mengatasi masalah itu, gunakan:

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

Membandingkan ukuran array ditambahkan (disarankan oleh super_ton) karena dapat meningkatkan kecepatan.

lepe
sumber
2
Perhatian: tidak berfungsi seperti yang diharapkan dengan array multidimensi
maersu
8
Komentar di atas salah. Jika $ b memiliki semua elemen $ a ditambah beberapa lainnya, kedua array tidak sama dengan kode di atas akan mengatakan ya.
Ghola
1
mungkin layak menambahkan count ($ a) == count ($ b) juga
stefan
1
@super_ton: ya, sebelum menelepon array_diffdapat mempercepat perbandingan. Saya akan menambahkannya. Terima kasih
lepe
3
Sayangnya, itu tidak berfungsi dalam beberapa kasus, misalnya, saya sudah menguji dengan kasus berikut $a = [1, 2, 2]; $b = [2, 1, 1];dan kembali true, tetapi dua array jelas tidak sama.
AwesomeGuy
33

Coba cerita bersambung. Ini akan memeriksa subarrays bersarang juga.

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
Iggi
sumber
7
Bermasalah jika kunci dan nilai digeser seperti menggunakan perbandingan. Namun, dengan asumsi mereka diharapkan 100% sama, ini adalah cara paling bersih dan termudah untuk memeriksa kesetaraan yang dalam!
Kevin Peno
1
Saya kira ini adalah solusi terbaik! Ia dapat membandingkan array multidimensi dan asosiatif jika sebelumnya disortir!
Rafael Moni
13

Solusi singkat yang bekerja bahkan dengan array kunci mana yang diberikan dalam urutan berbeda:

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}
Samuel Vicent
sumber
3
Mungkin jawaban terbaik sejauh ini, sebagian besar jawaban tidak cocok jika kunci digeser atau jika array multidimensi.
AwesomeGuy
11

Bandingkan nilai-nilai ini sebagai nilai lain:

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

Anda dapat membaca tentang semua operator array di sini: http://php.net/manual/en/language.operators.array.php Perhatikan misalnya yang ===juga memeriksa bahwa jenis dan urutan elemen dalam array adalah sama.

Emil Vikström
sumber
5
Atau ===tergantung pada perilaku yang diinginkan.
Matthew Flaschen
9

!===tidak akan berfungsi karena ini merupakan kesalahan sintaksis. Cara yang benar adalah !==(bukan tiga simbol "sama dengan")

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

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

Dari pov saya lebih baik menggunakan array_diff daripada array_intersect karena dengan pemeriksaan sifat ini perbedaan yang dihasilkan umumnya kurang dari kesamaan, dengan cara ini konversi bool lebih haus memori.

Sunting Catatan bahwa solusi ini untuk array sederhana dan melengkapi == dan === yang diposting di atas yang hanya berlaku untuk kamus.

Marcos Fernandez Ramos
sumber
4

array_diff - Menghitung perbedaan array

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

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

Bandingkan array1dengan satu atau lebih array lainnya dan mengembalikan nilai-nilai array1yang tidak ada pada array lainnya.

Scherbius.com
sumber
4
OP ingin "memeriksa apakah dua array sama". array_difftidak bisa memberitahumu itu. Coba array_diff([1, 2], [1, 2, 'hello']).
marcv
3

Metode lain untuk memeriksa kesetaraan terlepas dari urutan nilai berfungsi dengan menggunakan http://php.net/manual/en/function.array-intersect.php , seperti:

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

Berikut adalah versi yang berfungsi juga dengan array multidimensi menggunakan 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;
}
whitebrow
sumber
3
function compareIsEqualArray(array $array1,array $array):bool
{

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

}
dılo sürücü
sumber
2
Sangat membantu untuk menjelaskan apa yang dilakukan contoh kode. Apakah ini juga berfungsi untuk array multi dimensi?
k0pernikus
1
array_diff mendapatkan elemen yang berbeda dari array jika array_diff mengembalikan array kosong dua array sama
dılo sürücü
2

Satu cara: (menerapkan 'dianggap sama' untuk http://tools.ietf.org/html/rfc6902#section-4.6 )

Cara ini memungkinkan array asosiatif yang anggotanya dipesan secara berbeda - misalnya array dianggap sama di setiap bahasa kecuali 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));
}
Mike McCabe
sumber
1
Saya percaya Anda harus:$a[$key] = rksort($a[$key]);
pinkeen
2

Masalah sintaks pada array Anda

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

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

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

var_dump($diff); 
YEFFOU WAGOUM THIERRY HENRI
sumber
2

Berikut adalah contoh cara membandingkan dengan array dan mendapatkan apa yang berbeda di antara mereka.

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

Hasil:

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

        )

    [b] => MISSING IN SECOND
    [1] => DIFFERENT
    [2] => MISSING IN FIRST
)
Marko Šutija
sumber
1

Gunakan fungsi php array_diff (array1, array2);

Ini akan mengembalikan perbedaan antara array. Jika kosong maka mereka sama.

contoh:

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

Contoh 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; 
Wolfgang Leon
sumber
1
Secara teknis, itu tidak mengembalikan perbedaan antara array. Dokumentasi menyatakan "Membandingkan array1 dengan satu atau lebih array lainnya dan mengembalikan nilai dalam array1 yang tidak ada di salah satu array lainnya.". Jadi, jika semua nilai dari array1 ada di array2, bahkan jika array2 memiliki lebih banyak nilai, array_diff akan mengembalikan array kosong
2pha
Tidak "mencetak null", mencetak array kosong (setelah memperbaiki sekitar selusin kesalahan sintaks). Mungkin Anda bisa menggunakan (count(array_diff($a1, $a2)) + count(array_diff($a2, $a1))) === 0untuk menguji apakah array "sama"
user9645
Saya memperbaiki sintaks (bukan nol kosong, dan saya sedang mencampur koma -.-). Apa yang Anda usulkan saya pikir terlalu banyak. Memeriksa apakah array kosongnya sudah cukup.
Wolfgang Leon
1

Jika Anda ingin memeriksa array non asosiatif, inilah solusinya:

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

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
Santo Boldižar
sumber