无论顺序如何,检查关联的多维数组是否相等

时间:2016-10-12 15:09:55

标签: php arrays

这两个数组被认为是相同的,因为它们具有相同的第一维索引(电,气,水)相同的第二维索引(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.';
}

5 个答案:

答案 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!";
}