Hướng dẫn how do i check if two arrays have the same element in php? - làm cách nào để kiểm tra xem hai mảng có cùng phần tử trong php không?

Các câu trả lời đã cho chứa nhiều quirks khác nhau chứng minh đây không phải là vấn đề đơn giản và xác định "giá trị giống nhau" có nghĩa là gì về phía trước cho miền của bạn là quan trọng. Giải pháp của tôi cho việc này đòi hỏi các mục tiêu thiết kế sau:

  • Cả hai mảng nên được coi là "danh sách".
  • Giải pháp nên hoạt động với các mảng có chứa tất cả các loại (bao gồm các đối tượng, để tương thích với các tính năng như enums).
  • Các yếu tố lặp đi lặp lại nên được hỗ trợ.
  • Các trường hợp không hoạt động nên ném ngoại lệ.

Trường hợp kiểm tra để đánh giá các giải pháp trông giống như:

assertTrue(ArrayUtil::elementsEqual($array1, $array2));
        $this->assertSame($originalArray1, serialize($array1));
        $this->assertSame($originalArray2, serialize($array2));
    }

    /**
     * @dataProvider elementsEqualDataProviderFalseCases
     */
    public function test_elements_are_equal_false_cases(array $array1, array $array2): void {
        $originalArray1 = serialize($array1);
        $originalArray2 = serialize($array2);
        $this->assertFalse(ArrayUtil::elementsEqual($array1, $array2));
        $this->assertSame($originalArray1, serialize($array1));
        $this->assertSame($originalArray2, serialize($array2));
    }

    /**
     * @dataProvider exceptionTestCases
     */
    public function test_elements_are_equal_exceptional_cases(mixed $array1, mixed $array2, string $exception): void {
        $this->expectException($exception);
        $originalArray1 = serialize($array1);
        $originalArray2 = serialize($array2);
        $this->assertFalse(ArrayUtil::elementsEqual($array1, $array2));
        $this->assertSame($originalArray1, serialize($array1));
        $this->assertSame($originalArray2, serialize($array2));
    }

    public function elementsEqualDataProviderTrueCases(): \Generator {
        yield 'Empty arrays' => [
            [],
            [],
        ];
        yield 'Integer types' => [
            [1, 2, 3],
            [3, 2, 1],
        ];
        yield 'Boolean types' => [
            [true, false],
            [false, true],
        ];
        yield 'String types' => [
            ["abc", "def"],
            ["def", "abc"],
        ];
        $objectA = new \stdClass();
        $objectB = new \stdClass();
        yield 'Object types' => [
            [$objectA, $objectB],
            [$objectB, $objectA],
        ];

        $objectC = new \stdClass();
        yield 'Mixed types' => [
            [2, true, "foo", null, $objectC],
            ["foo", null, 2, true, $objectC],
        ];
        yield 'Array types' => [
            [[1, 2], [3, 4]],
            [[3, 4], [1, 2]],
        ];
        yield 'Repeated values' => [
            [1, 1, 2],
            [2, 1, 1],
        ];
    }

    public function elementsEqualDataProviderFalseCases(): \Generator {
        yield 'Integer types' => [
            [1, 2, 3],
            [4, 5, 6],
        ];
        yield 'Boolean types' => [
            [true],
            [false],
        ];
        yield 'String types' => [
            ["abc", "def"],
            ["hij", "abc"],
        ];
        yield 'Object types' => [
            [new \stdClass(), new \stdClass()],
            [new \stdClass(), new \stdClass()],
        ];
        $objectC = new \stdClass();
        yield 'Mixed types' => [
            [2, false, "foo", null, $objectC],
            ["foo", null, 2, true, $objectC],
        ];
        yield 'Array types' => [
            [[1, 2], [3, 4]],
            [[4, 3], [2, 1]],
        ];
        yield 'Repeated values' => [
            [1, 1, 2],
            [2, 2, 1],
        ];
        yield 'Repeated values, longer second argument' => [
            [1, 1, 2],
            [2, 2, 1, 1],
        ];
        yield 'Repeated values, longer first argument' => [
            [1, 1, 2, 2],
            [2, 2, 1],
        ];
    }

    public function exceptionTestCases(): \Generator {
        yield 'Non-list array first argument' => [
            ['foo' => 'bar'],
            [1, 2, 3],
            \InvalidArgumentException::class,
        ];
        yield 'Non-list array second argument' => [
            [1, 2, 3],
            ['foo' => 'bar'],
            \InvalidArgumentException::class,
        ];
        yield 'Non array arguments' => [
            "foo",
            "bar",
            \TypeError::class,
        ];
    }
}

Và giải pháp (được điều chỉnh chủ yếu từ câu trả lời của Seyfahni):

Làm thế nào bạn có thể biết nếu hai mảng có cùng một yếu tố?

Phương thức mảng.equals () kiểm tra sự bình đẳng của hai mảng về kích thước, dữ liệu và thứ tự của các phần tử. Phương pháp này sẽ chấp nhận hai mảng cần được so sánh và nó trả về kết quả boolean đúng nếu cả hai mảng đều bằng nhau và sai nếu các mảng không bằng nhau. equals() method checks the equality of the two arrays in terms of size, data, and order of elements. This method will accept the two arrays which need to be compared, and it returns the boolean result true if both the arrays are equal and false if the arrays are not equal.

2 mảng có thể bằng nhau không?

Hai mảng được coi là bằng nhau nếu cả hai mảng chứa cùng một số phần tử và tất cả các cặp phần tử tương ứng trong hai mảng là bằng nhau.Nói cách khác, hai mảng bằng nhau nếu chúng chứa các phần tử giống nhau theo cùng một thứ tự.Ngoài ra, hai tài liệu tham khảo mảng được coi là bằng nhau nếu cả hai là null.. In other words, two arrays are equal if they contain the same elements in the same order. Also, two array references are considered equal if both are null.

Cách nào sau đây là cách chính xác để kiểm tra xem hai mảng dưới đây có bằng nhau không?

Cách thích hợp để so sánh liệu hai mảng có bằng nhau hay không là sử dụng bình đẳng nghiêm ngặt (===), so sánh đệ quy.use strict equality (===), which compares recursively.

Tại sao hai trong số các mảng giống nhau không bằng nhau?

Nếu hai đối tượng riêng biệt có cùng số lượng thuộc tính, có cùng tên và giá trị, chúng vẫn không bằng nhau.Hai mảng có cùng một phần tử theo cùng một thứ tự không bằng nhau.Two arrays that have the same elements in the same order are not equal to each other.