PHP - Kiểm tra xem hai mảng có bằng nhau không


280

Tôi muốn kiểm tra xem hai mảng có bằng nhau không. Ý tôi là: cùng kích thước, cùng chỉ số, cùng giá trị. Làm thế nào tôi có thể làm điều đó?

Sử dụng !==theo đề xuất của người dùng, tôi hy vọng rằng phần sau sẽ in enter nếu có ít nhất một phần tử trong (các) mảng khác nhau, nhưng thực tế thì không.

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

    echo "enter";
}

17
Bạn đang sử dụng =quá nhiều, nó nên !==hoặc!=
jeroen

29
Chỉ dành cho bản ghi (vì bản chỉnh sửa của tôi đã được đổi lại thành "người dùng"), đó là "người dùng": english.stackexchange.com/questions/105116/
Khăn

7
['a'] == [0]true. Chà, đây chỉ là PHP.
Dávid Horváth

2
@ DávidHorváth thật kỳ lạ, một cách thực hành tốt để sử dụng luôn ===
AFA Med

1
@ DávidHorváth, so sánh lỏng lẻo không chỉ lỏng lẻo trong PHP. Nếu bạn nhìn vào JS, bạn sẽ ngạc nhiên. Chỉ không sử dụng cho đến khi bạn hiểu mọi thứ tốt hơn.
ryabenko-pro

Câu trả lời:


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.

Xem toán tử mảng .

BIÊN TẬP

Toán tử bất đẳng thức là !=trong khi toán tử không nhận dạng !==phải khớp với toán tử đẳng thức ==và toán tử nhận dạng ===.


79
Một lưu ý phụ: Cách tiếp cận này cũng hoạt động cho các mảng đa chiều (trước đây nó không rõ ràng đối với tôi).
trejder

5
PS: giải pháp là sử dụng array_values($a)==array_values($b)... Một vấn đề thông thường khác là về các giá trị duy nhất, vì vậy hãy nhớ rằng tồn tại array_unique().
Peter Krauss

13
Câu trả lời này là sai. ==hoạt động bất kể thứ tự chỉ dành cho từ điển điển hình như [1 => 'a', 2 => 'b']. Ví dụ [1 => 'a', 2 => 'b'] == [2 => 'b', 1 => 'a']. Đối với các mảng được lập chỉ mục như ['a', 'b'] ==không hoạt động như đã nêu. Ví dụ ['a', 'b'] != ['b', 'a'].
nawfal

37
@nawfal: Giả định của bạn là sai. ['a', 'b']là một mảng [0 => 'a', 1 => 'b'], trong khi ['b', 'a']là một mảng [0 => 'b', 1 => 'a']. Đó là lý do tại sao họ không có các cặp khóa / giá trị giống như đã nêu trong câu trả lời của tôi và đó là lý do tại sao ==chúng không hoạt động giữa các cặp .
Stefan Gehrig

29
@StefanGehrig oh bạn nói đúng. Tôi sẽ để lại bình luận của mình như vậy để làm cho sự ngu ngốc của tôi trở nên rõ ràng :)
nawfal

88

Theo trang này .

LƯU Ý: Câu trả lời được chấp nhận hoạt động cho các mảng kết hợp, nhưng nó sẽ không hoạt động như mong đợi với các mảng được lập chỉ mục (giải thích bên dưới). Nếu bạn muốn so sánh một trong hai, sau đó sử dụng giải pháp này. Ngoài ra, hàm này có thể không hoạt động với các mảng nhiều chiều (do bản chất của hàm Array_diff).

Kiểm tra hai mảng được lập chỉ mục, các phần tử theo thứ tự khác nhau, sử dụng $a == $bhoặc $a === $bthất bại, ví dụ:

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

Đó là bởi vì các phương tiện trên:

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

Để giải quyết vấn đề đó, hãy sử dụng:

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

So sánh kích thước mảng đã được thêm vào (được đề xuất bởi super_ton) vì nó có thể cải thiện tốc độ.


2
Chú ý: không hoạt động như mong đợi với các mảng đa chiều
maersu

8
Nhận xét trên là sai. Nếu $ b có tất cả các phần tử $ a có cộng với một số phần tử bổ sung, hai mảng không bằng nhau nhưng đoạn mã trên sẽ cho biết chúng là.
Ghola

1
có thể đáng để thêm số đếm ($ a) == đếm ($ b) quá
stefan

1
@super_ton: có, trước khi gọi array_diffcó thể tăng tốc độ so sánh. Tôi sẽ thêm nó. Cảm ơn
lepe

3
Thật không may, nó không hoạt động trong một số trường hợp, ví dụ, tôi đã thử nghiệm với trường hợp sau $a = [1, 2, 2]; $b = [2, 1, 1];và nó đã trả về true, nhưng hai mảng rõ ràng không giống nhau.
AwesomeGuy

33

Hãy thử nối tiếp. Điều này sẽ kiểm tra các chương trình con lồng nhau là tốt.

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

7
Có vấn đề nếu các khóa và giá trị được thay đổi xung quanh giống như sử dụng so sánh. Tuy nhiên, giả sử họ dự kiến ​​giống nhau 100%, đây là cách sạch nhất và dễ nhất để kiểm tra sự bình đẳng sâu sắc!
Kevin Peno

1
Tôi đoán đây là giải pháp tốt nhất! Nó có thể so sánh các mảng đa chiều và liên kết nếu chúng được sắp xếp trước đó!
Rafael Moni

13

Giải pháp ngắn hoạt động ngay cả với mảng mà các phím được đưa ra theo thứ tự khác nhau:

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

3
Có lẽ là câu trả lời tốt nhất cho đến nay, hầu hết các câu trả lời đều không khớp nếu các phím bị dịch chuyển hoặc nếu đó là một mảng nhiều chiều.
AwesomeGuy


9

!===sẽ không hoạt động vì đó là một lỗi cú pháp. Cách chính xác là !==(không phải ba ký hiệu "bằng")


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

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

Từ POV của tôi, tốt hơn là sử dụng Array_diff so với Array_intersect bởi vì với các kiểm tra về bản chất này, sự khác biệt được trả về thường ít hơn so với các điểm tương đồng, theo cách này, chuyển đổi bool sẽ ít đói hơn bộ nhớ.

Chỉnh sửa Lưu ý rằng giải pháp này dành cho mảng đơn giản và bổ sung cho == và === một trong số đó được đăng ở trên chỉ hợp lệ cho từ điển.


4

Array_diff - Tính toán sự khác biệt của mảng

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

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

So sánh array1với một hoặc nhiều mảng khác và trả về các giá trị array1không có trong bất kỳ mảng nào khác.


4
OP muốn "kiểm tra xem hai mảng có bằng nhau không". array_diffkhông thể nói với bạn điều đó. Hãy thử array_diff([1, 2], [1, 2, 'hello']).
marcv

3

Một phương pháp khác để kiểm tra sự bằng nhau bất kể thứ tự giá trị hoạt động bằng cách sử dụng http://php.net/manual/en/feft.array-intersect.php , như vậy:

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

Đây là phiên bản hoạt động với các mảng nhiều chiều bằng cách sử dụng http://php.net/manual/en/feft.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
Thật hữu ích để giải thích những gì một ví dụ mã đang làm. Điều này cũng làm việc cho các mảng đa chiều?
k0pernikus

1
mảng_diff lấy phần tử khác nhau từ mảng nếu mảng_diff trả về mảng trống hai mảng bằng nhau
dılo sürücü

2

Một cách: (thực hiện 'được coi là bằng nhau' cho http://tools.ietf.org/html/rfc6902#section-4.6 )

Cách này cho phép các mảng kết hợp có các thành viên được sắp xếp khác nhau - ví dụ: chúng được coi là bằng nhau trong mọi ngôn ngữ trừ 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
Tôi tin rằng bạn nên là:$a[$key] = rksort($a[$key]);
pinkeen

2

Vấn đề cú pháp trên mảng của bạn

$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

Dưới đây là ví dụ làm thế nào để so sánh với các mảng và có được những gì khác nhau giữa chúng.

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

Kết quả:

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

        )

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

1

Sử dụng hàm php Array_diff (mảng1, mảng2);

Nó sẽ trả về một sự khác biệt giữa các mảng. Nếu nó trống thì chúng bằng nhau.

thí dụ:

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

Ví dụ 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
Về mặt kỹ thuật, nó không trả về sự khác biệt giữa các mảng. Tài liệu nêu rõ "So sánh mảng1 với một hoặc nhiều mảng khác và trả về các giá trị trong mảng1 không có trong bất kỳ mảng nào khác." Vì vậy, nếu tất cả các giá trị từ mảng1 có trong mảng2, ngay cả khi mảng2 có nhiều giá trị hơn, mảng_diff sẽ trả về một mảng trống
2pha

Không "in null", in một mảng trống (sau khi sửa khoảng một chục lỗi cú pháp). Có lẽ bạn có thể sử dụng (count(array_diff($a1, $a2)) + count(array_diff($a2, $a1))) === 0để kiểm tra xem các mảng có "bằng nhau" không
user9645

Tôi đã sửa lỗi cú pháp (không null là trống và tôi đã trộn dấu phẩy -.-). Những gì bạn đang đề xuất tôi nghĩ là quá nhiều. Kiểm tra nếu một mảng trống của nó là đủ.
Wolfgang Leon

1

Nếu bạn muốn kiểm tra các mảng không liên kết, đây là giải pháp:

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

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.