[英]Comparing Changes in Multidimensional Arrays - PHP
我正在寻找一种比较PHP中两个数组的有效方法。 我有一个“之前”和“之后”数组,我需要获取特定更改的数组。 我确实设法使部分代码正确(不确定其有效性),但似乎无法进行最后的比较。
每个元素的第一部分本质上是一个ID,即使第二个元素(本质上是Name)被更改,ID也保持不变-例如,请注意Name1-Renamed。 ID是一样的。 有时,元素可能会被删除(请参阅ID 1233,“ Name3-Deleted”仅在“ before”数组中)或添加(如ID 1230,即“ Name4-New”)。 还要注意,ID虽然是唯一的,但不会以任何特定顺序排序。
因此,我需要找到已添加的项目-添加(在“之后”可用,但不在“之前”)-删除(在“之前”可用,但在“之后”)-更改(两者都可用,因为有ID匹配,但名称已更改)
而且我无法终生找到获取Changed元素的有效方法(最好是没有if或无关的循环)。 另外,您怎么看? array_udiff是执行此特定任务的最快/最佳方法吗?
<?php
//'BEFORE' ARRAY
$arr1 = array( array(1231, 'Name1'), array(1232, 'Name2'), array(1233, 'Name3-Deleted') );
//'AFTER' ARRAY
$arr2 = array( array(1231, 'Name1-Renamed'), array(1232, 'Name2'), array(1230, 'Name4-New') );
//'ADDED' ARRAY
$arr3 = array_udiff($arr2, $arr1, create_function(
'$a,$b',
'return $a[0] - $b[0]; ')
);
//'REMOVED' ARRAY
$arr4 = array_udiff($arr1, $arr2, create_function(
'$a,$b',
'return $a[0] - $b[0]; ')
);
//'CHANGED' ARRAY. CAN'T GET THIS TO WORK PROPERLY. EXPECTED RESULT IS AN ARRAY FOR THE RENAMED ITEM.
$arr5 = array_udiff($arr2, $arr1, create_function(
'$a,$b',
'return (strcmp($a[1],$b[1]))*(strcmp($a[0],$b[0])); ')
);
print("Elements Added\n");
print_r($arr3);
print("Elements Removed\n");
print_r($arr4);
print("Elements Renamed\n");
print_r($arr5);
?>
所以,差不多了。 有人知道如何解决此问题吗? 预先感谢您的所有帮助!
如果以后需要,则将结果填充到$added
和$changed
数组中,而不是直接输出。
$copyArr2 = $arr2;
foreach ($arr1 as $subArr1) {
$hit = false;
foreach ($copyArr2 as $key=>$subArr2) {
if ($subArr1[0] == $subArr2[0]) {
$hit = true;
if ($subArr1[1] != $subArr2[1]) {
print("Element changed:\n ".print_r($subArr2, true));
}
unset($copyArr2[$key]);
}
}
if (!$hit)
print("Element removed:\n ".print_r($subArr1, true));
}
print("Elements added:\n");
print_r($copyArr2);
输出:
Element changed:
Array
(
[0] => 1231
[1] => Name1-Renamed
)
Element removed:
Array
(
[0] => 1233
[1] => Name3-Deleted
)
Elements added:
Array
(
[2] => Array
(
[0] => 1230
[1] => Name4-New
)
)
更新:进行了小的修复。
//'BEFORE' ARRAY
$arr1 = array( array(1231, 'Name1'), array(1232, 'Name2'), array(1233, 'Name3-Deleted') );
//'AFTER' ARRAY
$arr2 = array( array(1231, 'Name1-Renamed'), array(1232, 'Name2'), array(1230, 'Name4-New') );
// Kudos to AbraCadaver for the following:
$arr1 = array_column($arr1, 1, 0);
$arr2 = array_column($arr2, 1, 0);
$added = array_diff_key($arr2, $arr1);
$deleted = array_diff_key($arr1, $arr2);
$modified = array_diff_key(array_diff($arr2, $arr1), $deleted, $added);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.