这两个数组被认为是相同的,因为它们具有相同的第一维索引(电,气,水)相同的第二维索引(Gym,Library),并且每个相交的值相同。值始终是文字而不是数组或对象。订单不重要。
PHP如何根据上述的相等定义验证它们是否相等?
Array
(
[Electric] => Array
(
[Gym] => 24
[Library] => 25
)
[Gas] => Array
(
[Gym] => 13
[Library] =>
)
[Water] => Array
(
[Gym] =>
[Library] =>
)
)
Array
(
[Gas] => Array
(
[Library] =>
[Gym] => 13
)
[Electric] => Array
(
[Gym] => 24
[Library] => 25
)
[Water] => Array
(
[Library] =>
[Gym] =>
)
)
EDIT。我的尝试如下......
if(count($arr1) != count($arr2) || array_diff($arr1, $arr2) !== array_diff($arr2, $arr1)) {
$error='Values do not match.';
}
答案 0 :(得分:0)
简单代码是:
$arr2;
$arr1;
$eq = true;
if (count($arr1) == count($arr2)) {
foreach ($arr1 as $k => $v) {
if (empty($arr2[$k]) || $arr2[$k]['Gym'] != $v['Gym'] || $arr2[$k]['Library'] != $v['Library']) {
$eq = false;
break;
}
}
} else {
$eq = false;
}
var_dump($eq);
<强>更新强>
没有固定键,内部foreach
变为:
foreach ($arr1 as $k => $v) {
if (empty($arr2[$k]) || array_diff_assoc($arr2[$k], $v)) {
$eq = false;
break;
}
}
答案 1 :(得分:0)
function arrayTwoLevelEquivalence(array $a, array $b) {
if (count($a) !== count($b)) {
return false;
}
foreach ($a as $k => $a2) {
if (!isset($b[$k])) {
return false;
}
$b2 = $b[$k];
if (count($a2) !== count($b2)) {
return false;
}
foreach ($a2 as $k2 => $v) {
if (!array_key_exists($k2, $b2) || $b2[$k2] !== $v) {
return false;
}
}
}
return true;
}
我拒绝使用array_diff_assoc()
,因为为方便起见,我不支持不必要的堆内存瞬态分配。
答案 2 :(得分:0)
$array1 = array("a" => "green", 'b'=>"red", 'c'=>"blue");
$array2 = array('b'=>"red", 'c'=>"blue", "a" => "green");
echo empty(array_diff_assoc($array1, $array2));
检查它,希望它能满足您的要求。它将检查两个关联数组是否相同,是否具有相同的顺序。
检查多维数组 -
function array_diff_assoc_recursive($array1, $array2)
{
foreach($array1 as $key => $value)
{
if(is_array($value))
{
if(!isset($array2[$key]))
{
$difference[$key] = $value;
}
elseif(!is_array($array2[$key]))
{
$difference[$key] = $value;
}
else
{
$new_diff = array_diff_assoc_recursive($value, $array2[$key]);
if($new_diff != FALSE)
{
$difference[$key] = $new_diff;
}
}
}
elseif(!isset($array2[$key]) || $array2[$key] != $value)
{
$difference[$key] = $value;
}
}
return !isset($difference) ? 0 : $difference;
}
我是从here
找到的答案 3 :(得分:0)
这是一个递归比较函数
function CompareRecursive($array1, $array2, &$mismatches) {
foreach ($array1 as $key => $value) {
if (!isset($array2[$key])) {
$mismatches[$key] = [ $value ];
continue;
}
$value2 = $array2[$key];
if (!is_array($value) || !is_array($value2)) {
if ($value != $value2) {
$mismatches[$key] = [
$value, $value2
];
}
} else {
$mismatches_internal = [];
CompareRecursive($value, $value2, $mismatches_internal);
if (!empty($mismatches_internal)) {
$mismatches[$key] = $mismatches_internal;
}
}
}
return empty($mismatches);
}
作为一个额外的奖励,它也跟踪不匹配的条目,使用此方法时有一个缺点,如果$array2
有$array1
没有的额外元素但是你可以解决它将无法工作这样做:
$isEqual = CompareRecursive($array1,$array2) && CompareRecursive($array2,$array1);
答案 4 :(得分:0)
如果你需要知道的是否匹配 - 没有任何进一步的细节:
function ksortRecursive(&$array)
{
if (is_array($array)) {
ksort($array);
foreach ($array as &$arr) {
ksortRecursive($arr);
}
}
}
ksortRecursive($arr1);
ksortRecursive($arr2);
if (serialize($arr1) == serialize($arr2)) {
echo "match!";
}