PHP - 두 배열이 동일한지 확인합니다.
두 배열이 동일한지 확인하고 싶습니다.같은 크기, 같은 지수, 같은 값.내가 어떻게 그럴 수 있을까?
사용.!==사용자가 제안했듯이 어레이 내의 적어도1개의 요소가 다른 경우 다음과 같이 enter를 출력할 것으로 예상되지만 실제로는 그렇지 않습니다.
if (($_POST['atlOriginal'] !== $oldAtlPosition)
or ($_POST['atl'] !== $aext)
or ($_POST['sidesOriginal'] !== $oldSidePosition)
or ($_POST['sidesOriginal'] !== $sideext)) {
echo "enter";
}
$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.
편집
부등식 연산자는!=비표준 연산자는!==등식 연산자를 일치시키다==그리고 아이덴티===.
이 페이지에 따르면.
메모: 사용 가능한 답변은 관련지어 어레이에서는 동작하지만 인덱스 어레이에서는 정상적으로 동작하지 않습니다(아래 설명).둘 중 하나를 비교하려면 이 솔루션을 사용하십시오.또한 이 함수는 (array_diff 함수의 특성상) 다차원 배열에서는 작동하지 않을 수 있습니다.
2개의 인덱스 어레이 테스트(요소의 순서가 다른 경우)$a == $b또는$a === $b는 실패합니다.예를 들어 보겠습니다.
<?php
(array("x","y") == array("y","x")) === false;
?>
이는 위의 내용이 다음을 의미하기 때문입니다.
array(0 => "x", 1 => "y")대.array(0 => "y", 1 => "x").
이 문제를 해결하려면 다음을 사용합니다.
<?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)
);
}
?>
속도가 향상될 수 있으므로 어레이 크기 비교가 추가되었습니다(super_ton에서 제안).
시리얼라이즈를 시도합니다.그러면 중첩된 하위 배열도 검사됩니다.
$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
다른 순서로 키가 주어지는 어레이에서도 동작하는 쇼트 솔루션:
public static function arrays_are_equal($array1, $array2)
{
array_multisort($array1);
array_multisort($array2);
return ( serialize($array1) === serialize($array2) );
}
다른 값과 비교합니다.
if($array_a == $array_b) {
//they are the same
}
모든 어레이 연산자에 대해서는, http://php.net/manual/en/language.operators.array.php 를 참조해 주세요.예를 들어 다음과 같습니다.===는 어레이 내 요소의 유형과 순서가 동일한지도 확인합니다.
function compareIsEqualArray(array $array1,array $array2):bool
{
return (array_diff($array1,$array2)==[] && array_diff($array2,$array1)==[]);
}
!===구문 오류이므로 작동하지 않습니다.올바른 방법은!==(3개의 "표시 대상" 기호가 아님)
if (array_diff($a,$b) == array_diff($b,$a)) {
// Equals
}
if (array_diff($a,$b) != array_diff($b,$a)) {
// Not Equals
}
제 관점에서는 array_diff를 array_intersect보다 사용하는 것이 좋습니다.이러한 성질을 체크하면 공통적으로 반환되는 차이가 유사점보다 적어지기 때문입니다.이렇게 하면 부울 변환에 필요한 메모리가 줄어듭니다.
편집 이 솔루션은 일반 어레이용이며 사전에만 유효한 위에 게시된 == 및 ===를 보완합니다.
값 순서에 관계없이 동등성을 확인하는 또 다른 방법은 다음과 같이 http://php.net/manual/en/function.array-intersect.php,을 사용하여 작동합니다.
$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';
}
다음은 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;
}
한 가지 방법: (https://www.rfc-editor.org/rfc/rfc6902#section-4.6)에 대해 '동등하다고 생각됨'을 확인)
이렇게 하면 멤버의 순서가 다른 어소시에이션 배열이 가능합니다.예를 들어 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 https://www.rfc-editor.org/rfc/rfc6902#section-4.6
function considered_equal($a1, $a2) {
return json_encode(rksort($a1)) === json_encode(rksort($a2));
}
array_diff : 배열의 차이를 계산합니다.
http://php.net/manual/en/function.array-diff.php
array array_diff ( array $array1 , array $array2 [, array $... ] )<고객명>의 비교
array1하나 이상의 다른 어레이와 비교하여 값을 반환합니다.array1하다
어레이 구문 문제
$array1 = array(
'a' => 'value1',
'b' => 'value2',
'c' => 'value3',
);
$array2 = array(
'a' => 'value1',
'b' => 'value2',
'c' => 'value3',
);
$diff = array_diff($array1, $array2);
var_dump($diff);
다음은 어레이와 비교하여 어레이 간의 차이를 확인하는 예입니다.
$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));
결과:
Array
(
[0] => DIFFERENT
[second] => Array
(
[a] => Array
(
[test] => DIFFERENT
[z] => MISSING IN FIRST
)
)
[b] => MISSING IN SECOND
[1] => DIFFERENT
[2] => MISSING IN FIRST
)
연관성이 없는 어레이를 체크하는 경우는, 다음과 같은 해결책이 있습니다.
$a = ['blog', 'company'];
$b = ['company', 'blog'];
(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
다음 솔루션은 콜백으로 전달할 수 있는 커스텀 평등 함수와 함께 작동합니다.어레이의 순서는 체크되지 않습니다.
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));
}
}
}
일반적으로 데이터베이스 통합 테스트에서 예상된 요소가 반환되는지 확인하고 싶지만 정렬에는 관심이 없습니다.
두 배열이 동일한지 여부를 비교하는 적절한 방법은 재귀적으로 비교하는 완전 등식(===)을 사용하는 것입니다.기존 응답은 임의 배열(순차 배열과 연관 배열이 혼합된 임의 깊이와 순서를 가진 배열)을 재귀적으로 정렬할 수 없으므로 임의 배열의 비교를 처리할 수 없습니다.시퀀셜 어레이는 시퀀셜 키(0,1,2,3...)를 가진 어소시에이션 어레이입니다만, 어소시에이션 어레이에는 시퀀셜 키가 없습니다.
이러한 임의의 어레이를 정렬하려면 , 다음의 작업을 실시할 필요가 있습니다.
- 하위 배열이 필요 없는 리프 노드를 향해 아래로 이동
- 시퀀셜 어레이를 시리얼화하여 정렬(커스텀 컴퍼레이터를 사용할 필요가 없음)
- 키별로 연관 배열 정렬
다음 코드는 위에서 설명한 솔루션을 구현합니다.법규의 개선을 환영한다.
function recur_sort( &$array ) {
foreach ( $array as &$value ) {
if ( is_array( $value ) ) recur_sort( $value );
}
if ( is_sequential_array( $array ) ) {
$array = array_map( function( $el ) { return json_encode( $el ); }, $array );
sort( $array, SORT_STRING );
$array = array_map( function( $el ) { return json_decode( $el, true ); }, $array );
return;
} else {
return ksort( $array );
}
}
function is_sequential_array(Array &$a) {
$n = count($a);
for($i=0; $i<$n; $i++) {
if(!array_key_exists($i, $a)) {
return false;
}
}
return true;
}
예(PHPUnit):
//A stricter and recursive assertEqualsCanonicalizing
public function assertSameCanonicalizing( $expected, $actual ) {
recur_sort( $expected );
recur_sort( $actual );
$this->assertSame( $expected, $actual );
}
동일한지 ( 「」 「」 「」 「」 「」=== 과 같은 할 수 있습니다
function array_eq($a, $b) {
// If the objects are not arrays or differ in their size, they cannot be equal
if (!is_array($a) || !is_array($b) || count($a) !== count($b)) {
return false;
}
// If the arrays of keys are not strictly equal (after sorting),
// the original arrays are not strictly equal either
$a_keys = array_keys($a);
$b_keys = array_keys($b);
array_multisort($a_keys);
array_multisort($b_keys);
if ($a_keys !== $b_keys) {
return false;
}
// Comparing values
foreach ($a_keys as $key) {
$a_value = $a[$key];
$b_value = $b[$key];
// Either the objects are strictly equal or they are arrays
// which are equal according to our definition. Otherwise they
// are different.
if ($a_value !== $b_value && !array_eq($a_value, $b_value)) {
return false;
}
}
return true;
}
php 함수 array_diff(array1, array2)를 사용합니다.
어레이 간의 차이를 반환합니다.비어있으면 동등합니다.
예:
$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' )
예 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;
언급URL : https://stackoverflow.com/questions/5678959/php-check-if-two-arrays-are-equal
'programing' 카테고리의 다른 글
| Vuetify 그리드를 사용하여 v-for 루프의 저장소 항목을 표시하는 방법 (0) | 2022.10.23 |
|---|---|
| Java 열거형에서 valueof() 및 toString()을 덮어씁니다. (0) | 2022.10.23 |
| 봄 3.0에 포함할 메이븐 종속성은 무엇입니까? (0) | 2022.10.22 |
| 대용량 텍스트 파일을 메모리에 로드하지 않고 한 줄씩 읽는 방법은 무엇입니까? (0) | 2022.10.22 |
| MySQL에서 행 수 증가 속도 향상 (0) | 2022.10.22 |