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);
结果就是这样
bool(false) 
Array ( [name] => 1 [income] => Array ( [month] => 1 [year] => 1 ) [message] => 1 ) 
作者需要一个能够测试阵列结构是否相同的解决方案.下一个功能将完成一项工作.
/**
 * $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;
}
并测试它:
$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);
这将输出:
bool(false)
Array
(
    [income] => Array
    (
        [month] => Array()
    )
    [message] => 
)
因此,检查$ diff数组的空白将告诉您数组是否具有相同的结构.
注意:如果需要,还可以在其他方向上测试它,看看测试数组是否有一些原始静态数组中不存在的额外键.