317

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 ít nhất một phần tử trong (các) mảng khác nhau, nhưng trên thực tế thì không.

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

    echo "enter";
}
|
583
$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 Các toán tử mảng .

BIÊN TẬP

Toán tử bất bình đẳng là !=trong khi toán tử không định danh là !==để khớp với toán tử bình đẳng ==và toán tử nhận dạng ===.

|
  • 1
    Một lưu ý phụ: Cách tiếp cận này cũng hoạt động đối với các mảng đa chiều (đối với tôi trước đây nó không rõ ràng lắm). –  08:41:20 23/09/2013
  • 1
    Tái bút: 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(). –  10:53:03 15/10/2014
  • 1
    Câu trả lời này là sai. ==hoạt động bất kể thứ tự chỉ cho các 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']. –  12:56:34 15/11/2015
  • 1
    @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 chúng không có các cặp khóa / giá trị giống nhau 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 chúng. –  13:00:06 15/11/2015
  • 1
    @StefanGehrig ồ bạn nói đúng. Tôi sẽ để lại nhận xét của tôi như vậy để làm cho sự ngu ngốc của tôi hiển nhiên :) –  13:03:54 15/11/2015
100

Theo trang này .

LƯU Ý: Câu trả lời được chấp nhận hoạt động cho các mảng liên kết, 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, thì hãy 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 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ử có thứ tự khác nhau, sử dụng $a == $bhoặc $a === $bkhông thành công, ví dụ:

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

Đó là bởi vì những điều trên có nghĩa là:

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 (do super_ton đề xuất) vì nó có thể cải thiện tốc độ.

|
  • 1
    Chú ý: không hoạt động như mong đợi với mảng đa chiều –  16:13:02 09/04/2014
  • 1
    Nhận xét trên là sai. Nếu $ b có tất cả các phần tử mà $ a có cộng với một số phần tử thừa, thì hai mảng không bằng nhau nhưng đoạn mã trên sẽ cho biết chúng là như nhau. –  12:14:46 08/09/2014
  • 1
    có thể là giá trị thêm count ($ a) == count ($ b) quá –  10:20:27 07/09/2016
  • 1
    @super_ton: vâng, trước khi gọi array_diffcó thể tăng tốc độ so sánh. Tôi sẽ thêm nó. Cảm ơn –  00:35:47 08/09/2016
  • 1
    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 là không giống nhau. –  13:00:35 28/09/2018
36

Hãy thử tuần tự hóa. Điều này cũng sẽ kiểm tra các mảng con lồng nhau.

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
|
  • 1
    Có vấn đề nếu các khóa và giá trị bị dịch chuyển xung quanh giống như sử dụng so sánh. Tuy nhiên, giả sử chúng được mong đợi là giống nhau 100%, đây là cách rõ ràng và dễ dàng nhất để kiểm tra sự bình đẳng sâu sắc! –  20:59:12 21/08/2013
  • 1
    Tôi đoán đây là giải pháp tốt nhất! Nó có thể so sánh mảng đa chiều và mảng liên kết nếu chúng đã được sắp xếp trước đó! –  14:41:00 24/07/2014
  • 1
    nếu mảng được coi là SET, điều này không hoạt động: nó phải được sắp xếp theo tất cả các mức lồng nhau để có thể kiểm tra xem các mục giống nhau có được đưa vào bất kỳ thứ tự nào hay không. –  22:21:28 20/10/2020
18

Giải pháp ngắn gọn hoạt động ngay cả với các mảng có các khóa được cung cấp 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) );
}
|
  • 1
    Có lẽ là câu trả lời hay 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 được dịch chuyển hoặc nếu đó là một mảng đa chiều. –  13:06:54 28/09/2018
  • 1
    Sự lựa chọn tốt! Nhưng lưu ý rằng phương pháp này sử dụng phép so sánh kiểu nghiêm ngặt, vì vậy nếu bạn muốn so sánh [1,2,3] và ['1', '2', '3'] thì kết quả sẽ là false. –  20:02:17 25/06/2020
  • 1
    Đây phải là câu trả lời được chấp nhận –  14:40:04 15/03/2021
11

So sánh chúng như các giá trị khác:

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

Bạn có thể đọc về tất cả các toán tử mảng tại đây: http://php.net/manual/en/language.operators.array.php Ví dụ : Lưu ý rằng ===cũng kiểm tra xem loại và thứ tự của các phần tử trong mảng có giống nhau không.

|
9

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

|
7
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 nên sử dụng array_diff hơn array_intersect vì với các lần kiểm tra về bản chất này, sự khác biệt được trả về thường ít hơn sự tương đồng, theo cách này, việc chuyển đổi bool sẽ ít tốn bộ nhớ hơn.

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

|
5
function compareIsEqualArray(array $array1,array $array):bool
{

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

}
|
  • 1
    Sẽ rất hữu ích khi giải thích một ví dụ mã đang làm gì. Điều này cũng hoạt động đối với mảng nhiều chiều? –  17:12:33 02/08/2019
  • 1
    array_diff có được yếu tố khác nhau từ mảng nếu array_diff trở lại trống mảng hai mảng là bình đẳng –  12:38:49 03/08/2019
3

Sự cố 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); 
|
3

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

http://php.net/manual/en/ Chức năng.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ề giá trị trong array1đó không có trong bất kỳ mảng nào khác.

|
  • 1
    OP muốn "kiểm tra xem hai mảng có bằng nhau hay không". array_diffkhông thể nói với bạn điều đó. Cố gắng array_diff([1, 2], [1, 2, 'hello']). –  18:44:42 02/12/2016
3

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

$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à một phiên bản cũng hoạt động với các mảng đa chiều bằng cách sử dụng http://php.net/manual/en/ Chức năng.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;
}
|
2

Dưới đây là ví dụ về cách so sánh với các mảng và lấy điểm khác biệt 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
)
|
2

Một cách: (triển khai 'được coi là bình đẳng' 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 sẽ được coi là bình đẳng 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

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
|
  • 1
    tôi đã nhận 'Equals' sau: $a = array('a', 'b', 'c', 'd'); $b = array('a', 'c', 'b'); echo (count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals'; –  12:19:34 23/07/2020
1

Sử dụng hàm php array_diff (array1, array2);

Nó sẽ trả về 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ừ array1 có mặt trong array2, ngay cả khi array2 có nhiều giá trị, array_diff sẽ trả về một mảng trống rỗng –  07:04:27 13/06/2016
  • 1
    Không "in null", in ra một mảng trống (sau khi sửa khoảng 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 nếu mảng là "bình đẳng" –  14:42:21 03/02/2017
  • 1
    Tôi đã sửa cú pháp (không null là trống, và tôi đang trộn dấu phẩy -.-). Những gì bạn đang đề xuất tôi nghĩ là quá nhiều. Kiểm tra xem một mảng trống của nó có đủ hay không. –  17:17:34 03/02/2017
0

Giải pháp sau hoạt động với các hàm bình đẳng tùy chỉnh mà bạn có thể chuyển như một lệnh gọi lại. Lưu ý rằng nó không kiểm tra thứ tự mảng.

trait AssertTrait
{
    /**
     * Determine if two arrays have the same elements, possibly in different orders. Elements comparison function must be passed as argument.
     *
     * @param array<mixed> $expected
     * @param array<mixed> $actual
     *
     * @throws InvalidArgumentException
     */
    public static function assertArraysContainSameElements(array $expected, array $actual, callable $comparisonFunction): void
    {
        Assert::assertEquals(\count($expected), \count($actual));

        self::assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes($expected, $actual, $comparisonFunction);
        self::assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes($actual, $expected, $comparisonFunction);
    }

    /**
     * @param array<mixed> $needles
     * @param array<mixed> $haystack
     *
     * @throws InvalidArgumentException
     */
    private static function assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes(
        array $needles,
        array $haystack,
        callable $comparisonFunction
    ): void {
        Assert::assertLessThanOrEqual(\count($needles), \count($haystack));

        foreach ($needles as $expectedElement) {
            $matchesOfExpectedElementInExpected = \array_filter(
                $needles,
                static fn($element): bool => $comparisonFunction($expectedElement, $element),
            );

            $matchesOfExpectedElementInActual = \array_filter(
                $haystack,
                static fn($element): bool => $comparisonFunction($expectedElement, $element),
            );

            Assert::assertEquals(\count($matchesOfExpectedElementInExpected), \count($matchesOfExpectedElementInActual));
        }
    }
}

Tôi thường sử dụng nó trong các bài kiểm tra tích hợp cơ sở dữ liệu khi tôi muốn đảm bảo rằng các phần tử mong đợi được trả về nhưng tôi không quan tâm đến việc sắp xếp.

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.