可能重复:
递归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
}
}
}