Php 检查多维数组的“形式”以进行验证

Php 检查多维数组的“形式”以进行验证,php,arrays,validation,Php,Arrays,Validation,可能重复: 我有一个静态多维数组,它总是以相同的形式出现。例如,它将具有相同的键和层次结构 我想检查一个发布的数组是否与这个静态数组处于相同的“形式”,如果不是,则检查错误 我一直在尝试各种方法,但它们最终似乎都有很多if…else组件,而且相当混乱 有没有一种简洁的方法可以做到这一点 针对dfsq的回答: $etalon = array( 'name' => array(), 'income' => array( 'day' => '',

可能重复:

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

我想检查一个发布的数组是否与这个静态数组处于相同的“形式”,如果不是,则检查错误

我一直在尝试各种方法,但它们最终似乎都有很多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 ) 
您正在搜索或函数吗?

您正在搜索或函数吗?

您可以使用户检查它们是否包含相同的键。如果是,则该函数生成的数组将包含与源数组相同的值

假设这些函数不是递归函数,那么您必须围绕它们编写一个递归包装器

请参阅

上的用户说明,您可以使用户检查它们是否包含相同的密钥。如果是,则该函数生成的数组将包含与源数组相同的值

假设这些函数不是递归函数,那么您必须围绕它们编写一个递归包装器


请参阅

上的用户说明将foreach与ifs一起使用…如果您对不同的内键进行了不同的测试,例如

$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
                    }
            }
    }

如果你对不同的内键有不同的测试,比如

$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
                    }
            }
    }

作者需要一个解决方案来测试数组的结构是否相同。下一个函数将生成一个作业

/**
 * $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数组是否为空将告诉您数组是否具有相同的结构


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

作者需要一个解决方案来测试数组的结构是否相同。下一个函数将生成一个作业

/**
 * $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数组是否为空将告诉您数组是否具有相同的结构


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

嗨,为这一点干杯,我将尝试一下,稍后发布结果。嗨,为此干杯,我要试一试,稍后发布结果。谢谢,我现在试一试!您好,恐怕这个好像不能正常工作。当您将$a1和$a2作为相同的结构时,它仍然会给出数组[income]=>Array[month]=>1[year]=>1的输出,这表明它与$a1数组中的空数组“month”和“year”有问题。如果您定义$a1=Array[income]=>Array[month]=>Array[year]=>Array,那么它的结构就不同于$a2=Array[income]=>Array[month]=>1[year]=>1,因为1是一个标量,而不是数组。如果我理解你的意思。对不起,数组[income]=>数组[month]=>1[year]=>1是函数的返回值,例如,它认为它们不同。你能发布你的数组示例以便我看到吗?因为我的数组函数工作得很好。谢谢,我现在正在尝试!您好,恐怕这个好像不能正常工作。当您将$a1和$a2作为相同的结构时,它仍然会给出数组[income]=>Array[month]=>1[year]=>1的输出,这表明它与$a1数组中的空数组“month”和“year”有问题。如果您定义$a1=Array[income]=>Array[month]=>Array[year]=>Array,那么它的结构就不同于$a2=Array[income]=>Array[month]=>1[year]=>1,因为1是一个标量,而不是数组。如果我理解你的意思。对不起,数组[income]=>数组[month]=>1[year]=>1是函数的返回值,例如,它认为它们不同。你能发布你的数组示例以便我看到吗?因为对于我的数组,函数可以很好地工作。。