如何检查相同键对的多维数组,即完全相同的键,但值可能不同?

时间:2019-03-01 11:13:58

标签: php arrays

我已经提出了这个解决方案,这对于普通数组而言工作正常,但对于多维数组却无法解决。

$a = ['a'=>11, 'b'=>2,'c'=>['r'=>5,'s'=>8]];
$b = ['a'=>1, 'b'=>2, 'c'=>['r'=>15,'s'=>18]];


function array_equal($a, $b) {
    return (
         is_array($a) 
         && is_array($b) 
         && count($a) == count($b) 
         && array_diff_key($a, $b) === array_diff_key($b, $a)
    );
}


$c = array_equal($a,$b);
echo $c;

对于上述数组集,它工作正常。

但是对于以下数组,即使键不同,它也会返回1。

$a = ['a'=>11, 'b'=>2,'c'=>['r'=>5,'s'=>8]];
$b = ['a'=>1, 'b'=>2, 'c'=>['r1'=>15,'m'=>18]];

3 个答案:

答案 0 :(得分:3)

如果阵列键的顺序相同,这将起作用:

https://3v4l.org/jDmON

<?php

function array_keys_recursive(array $array) : array
{
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $index[$key] = array_keys_recursive($value);
        } else {
            $index []= $key;
        }
    }

    return $index ?? [];
}


$a = ['a'=>11, 'b'=>2,'c'=>['r'=>5,'s'=>8]];
$b = ['a'=>1, 'b'=>2, 'c'=>['r'=>15,'s'=>18]];

var_dump(array_keys_recursive($a) === array_keys_recursive($b)); // true

$a = ['a'=>11, 'b'=>2,'c'=>['r'=>5,'s'=>8]];
$b = ['a'=>1, 'c'=>2, 'b'=>['r'=>15,'s'=>18]];

var_dump(array_keys_recursive($a) === array_keys_recursive($b)); // false

$a = ['a'=>11, 'b'=>2,'c'=>['r'=>5,'s'=>8]];
$b = ['a'=>1, 'b'=>2, 'c'=>['r1'=>15,'m'=>18]];

var_dump(array_keys_recursive($a) === array_keys_recursive($b)); // false

答案 1 :(得分:1)

这应该有效-

function array_equal($a, $b) {
    // count mismatch -> not equal
    if (count($a) != count($b)) {
        return false;
    }
    foreach ($a as $key => $val) {
        // key not present -> not equal
        if (empty($b[$key])) {
            return false;
        }
        // check for inner arrays
        if (is_array($val)) {
            return array_equal($val, $b[$key]);
        }
    }
    return true;
}

array_equal($a, $b); // true for first arrays

$a = ['a'=>11, 'b'=>2,'c'=>['r'=>5,'s'=>8]];
$b = ['a'=>1, 'b'=>2, 'c'=>['r1'=>15,'m'=>18]];
array_equal($a, $b); // false

答案 2 :(得分:0)

我正在阅读您的问题,因为您想检查相同的键结构,但不在乎值。

我在这里通过将两个数组的所有叶子值都更改为null来作弊,然后您可以比较剩余的食物。

<?php

$a = ['a'=>11, 'b'=>2, 'c'=> ['r'=>5, 's'=>8 ]];
$b = ['a'=>1,  'b'=>2, 'c'=> ['r'=>15,'s'=>18]];

function arrays_have_same_keys(array $a, array $b) {
    array_walk_recursive($a, function(&$v) {
        $v = null;
    });
    array_walk_recursive($b, function(&$v) {
        $v = null;
    });

    return $a==$b;
}

var_dump(arrays_have_same_keys($a, $b));

输出:

bool(true)