PHP – 检查两个数组是否相等
我想检查两个数组是否相等。 我的意思是:相同的大小,相同的索引,相同的值。 我怎样才能做到这一点?
使用===
如用户所build议的,我期望如果数组中至less有一个元素是不同的,但是实际上它不会。
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.
请参阅数组运算符 。
编辑
不等式运算符是!=
,而非同一运算符是!==
以匹配等号运算符==
和身份运算符===
。
根据这个页面 。
注意:接受的答案适用于关联数组,但是它不能按照预期的方式使用索引数组(如下所述)。 如果你想比较他们中的任何一个,那么使用这个解决scheme。 此外,这个函数可能不适用于multidimensional array(由于array_diff函数的性质)。
使用$a == $b
或$a === $b
testing两个索引数组,哪些元素的顺序不同,例如:
<?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_tonbuild议),因为它可以提高速度。
尝试序列化。 这也将检查嵌套的子arrays。
$foo =serialize($array_foo); $bar =serialize($array_bar); if ($foo == $bar) echo "Foo and bar are equal";
将其作为其他值进行比较:
if($array_a == $array_b) { //they are the same }
你可以在这里阅读关于所有数组运算符: http : //php.net/manual/en/language.operators.array.php注意例如===
还检查数组中元素的types和顺序是相同。
!===
不会工作,因为这是一个语法错误。 正确的方法是!==
(不是三个“等于”符号)
您可以使用array_diff_assoc
来检查两者之间的差异。
一种方法:(实施http://tools.ietf.org/html/rfc6902#section-4.6的; “相当于”
这种方式允许关联数组的成员sorting不同 – 例如,他们会被认为是平等的每种语言,但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 (eg "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)); }
另一种检查等值而不考虑价值顺序的方法是使用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'; }
这是一个版本,也适用于multidimensional array使用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; }
array_diff – 计算数组的差异
http://php.net/manual/en/function.array-diff.php
array array_diff ( array $array1 , array $array2 [, array $... ] )
将
array1
与一个或多个其他数组进行比较,并返回array1
中不存在于其他数组中的值。
即使在数组中按照不同的顺序给出的键也可以使用简短的解决scheme:
public static function arrays_are_equal($array1, $array2) { array_multisort($array1); array_multisort($array2); return ( serialize($array1) === serialize($array2) ); }
使用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;