我想检查两个数组是否相等。我的意思是:相同的大小,相同的索引,相同的值。我怎么能这样做?
根据用户的建议使用===
,如果数组中至少有一个元素不同,我希望以下内容会打印输入,但事实上并非如此
if (($_POST['atlOriginal'] !=== $oldAtlPosition)
or ($_POST['atl'] !=== $aext)
or ($_POST['sidesOriginal'] !=== $oldSidePosition)
or ($_POST['sidesOriginal'] !=== $sideext)) {
echo "enter";
}
答案 0 :(得分:434)
$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 Operators。
修改强>
不等式运算符为!=
,而非标识运算符为!==
以匹配相等性
运算符==
和标识运算符===
。
答案 1 :(得分:70)
根据this page。
注意:接受的答案适用于关联数组,但对于索引数组,它将无法正常工作(如下所述)。如果要比较它们中的任何一个,请使用此解决方案。此外,此函数可能不适用于多维数组(由于array_diff函数的性质)。
使用$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建议),因为它可以提高速度。
答案 2 :(得分:31)
尝试序列化。这也将检查嵌套的子数组。
$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
答案 3 :(得分:9)
将它们作为其他值进行比较:
if($array_a == $array_b) {
//they are the same
}
您可以在此处阅读所有数组运算符:
http://php.net/manual/en/language.operators.array.php
例如,===
还检查数组中元素的类型和顺序是否相同。
答案 4 :(得分:9)
!===
无效,因为它是语法错误。正确的方法是!==
(不是三个&#34;等于&#34;符号)
答案 5 :(得分:5)
工作简短的解决方案,即使对于以不同顺序给出键的数组也是如此:
public static function arrays_are_equal($array1, $array2)
{
array_multisort($array1);
array_multisort($array2);
return ( serialize($array1) === serialize($array2) );
}
答案 6 :(得分:2)
另一种检查相等性的方法,无论值顺序如何,都可以使用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;
}
答案 7 :(得分:2)
以下是如何与数组进行比较并了解它们之间的区别的示例。
$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
)
答案 8 :(得分:1)
array_diff - 计算数组的差异
http://php.net/manual/en/function.array-diff.php
array array_diff ( array $array1 , array $array2 [, array $... ] )
将
array1
与一个或多个其他数组进行比较,并返回array1
中任何其他数组中不存在的值。
答案 9 :(得分:1)
一种方式:(为http://tools.ietf.org/html/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 http://tools.ietf.org/html/rfc6902#section-4.6
function considered_equal($a1, $a2) {
return json_encode(rksort($a1)) === json_encode(rksort($a2));
}
答案 10 :(得分:1)
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,因为经过这种性质的检查,通常返回的差异小于相似性,这样布尔转换就减少了内存消耗。
编辑请注意,此解决方案适用于纯数组,并补充了==和===上面发布的仅对词典有效的一个。
答案 11 :(得分:1)
function compareIsEqualArray(array $array1,array $array):bool
{
return array_diff($array1,$array2)==[];
}
答案 12 :(得分:0)
使用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;
答案 13 :(得分:0)
数组上的语法问题
$array1 = array(
'a' => 'value1',
'b' => 'value2',
'c' => 'value3',
);
$array2 = array(
'a' => 'value1',
'b' => 'value2',
'c' => 'value3',
);
$diff = array_diff($array1, $array2);
var_dump($diff);
答案 14 :(得分:0)
如果要检查非关联数组,请使用以下解决方案:
/refresh
答案 15 :(得分:0)
以下解决方案适用于您可以作为回调传递的自定义相等函数。请注意,它不会检查数组顺序。
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));
}
}
}
当我想确保返回预期元素但不关心排序时,我通常在数据库集成测试中使用它。