递归array_diff()?
我正在寻找一些工具来给我两个数组的递归差异。我设想的是一个具有两个颜色编码树结构的网页。在每棵树上,绿色是数组中两个数组中匹配的部分,红色表示每个数组中彼此不匹配的部分。类似于 dBug 的输出
我有一些代码,为我提供了一个嵌套数组来填充报表。我正在开发一种应该更快的新方法,但我需要测试值和结构,以确保它给出与旧方法相同的输出。
那里有我可以使用的东西吗?还是我需要写这个?还是有另一种方法可以实现我的目标?
我正在寻找一些工具来给我两个数组的递归差异。我设想的是一个具有两个颜色编码树结构的网页。在每棵树上,绿色是数组中两个数组中匹配的部分,红色表示每个数组中彼此不匹配的部分。类似于 dBug 的输出
我有一些代码,为我提供了一个嵌套数组来填充报表。我正在开发一种应该更快的新方法,但我需要测试值和结构,以确保它给出与旧方法相同的输出。
那里有我可以使用的东西吗?还是我需要写这个?还是有另一种方法可以实现我的目标?
在array_diff的评论中实现了一个这样的功能。
function arrayRecursiveDiff($aArray1, $aArray2) {
$aReturn = array();
foreach ($aArray1 as $mKey => $mValue) {
if (array_key_exists($mKey, $aArray2)) {
if (is_array($mValue)) {
$aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
} else {
if ($mValue != $aArray2[$mKey]) {
$aReturn[$mKey] = $mValue;
}
}
} else {
$aReturn[$mKey] = $mValue;
}
}
return $aReturn;
}
该实现一次只处理两个数组,但我认为这并没有真正带来问题。如果一次需要 3 个或更多数组的差异,则可以按顺序运行 diff。此外,此方法使用密钥检查并执行松散验证。
接受的答案接近正确,但它并没有真正正确模拟。array_diff
有两个问题主要围绕键匹配:
array_diff
具有特定行为,如果第二个数组的值仍在第二个数组中,则不会为第二个数组中完全缺少的数组键生成结果。如果您有两个数组和 ,使用接受的答案的函数,则输出将为 。如果运行相同的数组,它将生成一个空数组。这是因为如果缺少数组键,则上述函数的最终语句会将其添加到 diff 中,但这不是 的预期行为。这两个数组也是如此:和 。 将生成一个空数组。$first = ['foo' => 2, 'moo' => 2]
$second = ['foo' => 2]
['moo' => 2]
array_diff
else
array_diff
$first = ['foo' => 1]
$second = [1]
array_diff
如果两个数组具有相同的值但键不同,则返回的值将多于预期值。如果您有两个数组和 ,则来自已接受答案的函数将输出 来自 的所有值。这是因为它在每次迭代时执行严格的键匹配,其中它在两个数组中找到相同的键(数字或其他),而不是检查第二个数组中的所有其他值。$foo = [1, 2]
$moo = [2, 1]
$foo
以下函数是相似的,但作用更接近您预期的工作方式(也具有不那么愚蠢的变量名称):array_diff
function array_diff_recursive($arr1, $arr2)
{
$outputDiff = [];
foreach ($arr1 as $key => $value)
{
//if the key exists in the second array, recursively call this function
//if it is an array, otherwise check if the value is in arr2
if (array_key_exists($key, $arr2))
{
if (is_array($value))
{
$recursiveDiff = array_diff_recursive($value, $arr2[$key]);
if (count($recursiveDiff))
{
$outputDiff[$key] = $recursiveDiff;
}
}
else if (!in_array($value, $arr2))
{
$outputDiff[$key] = $value;
}
}
//if the key is not in the second array, check if the value is in
//the second array (this is a quirk of how array_diff works)
else if (!in_array($value, $arr2))
{
$outputDiff[$key] = $value;
}
}
return $outputDiff;
}