检查多维数组的"形式"以进行验证

Jul*_*n S 1 php arrays validation

可能重复:
递归array_diff()?

我有一个静态的多维数组,它总是以相同的形式存在.例如,它将具有相同的键和层次结构.

我想检查一个已发布的数组与此静态数组处于相同的"形式",如果没有错误.

我一直在尝试各种方法,但它们似乎最终都有很多if ... else组件并且相当混乱.

有没有简洁的方法来实现这一目标?


回应dfsq的回答:

$etalon = array(
    'name' => array(),
    'income' => array(
        'day'   => '',
        'month' => array(),
        'year'  => array()
    ),
    'message' => array(),
);

$test = array(
    'name' => array(),
    'income' => array(
        'day'   => '',
        'month' => array(),
        'year'  => array()
    ),
    'message' => array(),
);

// Tests
$diff = array_diff_key_recursive($etalon, $test);
var_dump(empty($diff));
print_r($diff);
Run Code Online (Sandbox Code Playgroud)

结果就是这样

bool(false) 
Array ( [name] => 1 [income] => Array ( [month] => 1 [year] => 1 ) [message] => 1 ) 
Run Code Online (Sandbox Code Playgroud)

dfs*_*fsq 5

作者需要一个能够测试阵列结构是否相同的解决方案.下一个功能将完成一项工作.

/**
 * $a1 array your static array.
 * $a2 array array you want to test.
 * @return array difference between arrays. empty result means $a1 and $a2 has the same structure.
 */ 
function array_diff_key_recursive($a1, $a2)
{
    $r = array();

    foreach ($a1 as $k => $v)
    {
        if (is_array($v))
        {
            if (!isset($a2[$k]) || !is_array($a2[$k]))
            {
                $r[$k] = $a1[$k];
            }
            else
            {
                if ($diff = array_diff_key_recursive($a1[$k], $a2[$k]))
                {
                    $r[$k] = $diff;
                }
            }
        }
        else
        {
            if (!isset($a2[$k]) || is_array($a2[$k]))
            {
                $r[$k] = $v;
            }
        }
    }

    return $r;
}
Run Code Online (Sandbox Code Playgroud)

并测试它:

$etalon = array(
    'name' => '',
    'income' => array(
        'day'   => '',
        'month' => array(),
        'year'  => array()
    ),
    'message' => ''
);

$test = array(
    'name' => 'Tomas Brook',
    'income' => array(
        'day'   => 123,
        'month' => 123,
        'year'  => array()
    )
);

// Tests
$diff = array_diff_key_recursive($etalon, $test);
var_dump(empty($diff));
print_r($diff);
Run Code Online (Sandbox Code Playgroud)

这将输出:

bool(false)
Array
(
    [income] => Array
    (
        [month] => Array()

    )

    [message] => 
)
Run Code Online (Sandbox Code Playgroud)

因此,检查$ diff数组的空白将告诉您数组是否具有相同的结构.

注意:如果需要,还可以在其他方向上测试它,看看测试数组是否有一些原始静态数组中不存在的额外键.