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