检查';表单';用于验证的多维数组的


Check the 'form' of a multidimensional array for 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数组是否为空会告诉您数组是否具有相同的结构。

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

您可以使用array_intersect_key()来检查它们是否都包含相同的键。如果是,则该函数的结果数组将包含与源数组上的array_keys()相同的值。

AFAIK这些函数不是递归的,所以你必须围绕它们编写一个递归包装器。

请参阅上的用户说明http://php.net/array_diff_key

您在搜索array_diff还是array_diff_assoc函数?

使用foreach和if。。。如果你对不同的内部密钥有不同的测试,例如

$many_entries = ("entry1" = array("name"=>"obi", "height"=>10));   

依此类推,首先定义检查不同键的函数然后是像这样的foreach语句

foreach($many_entries as $entry)
    { 
        foreach($entry as $key => $val) 
            {
                switch($key)
                    {
                        case "name": //name function
                            //and so on
                    }
            }
    }