我正在寻找一种比较PHP中两个数组的有效方法。我有一个"之前"和"之后"数组,我需要获得特定更改的数组。我确实设法正确地获得了部分代码(不确定它的效果如何),但我似乎无法让最后的比较工作。
每个元素的第一部分本质上是一个ID,即使第二个元素(本质上是一个Name)被更改,它也保持不变 - 注意Name1-重命名为例如。 ID是一样的。有时可能会删除某个元素(参见ID 1233,' Name3-Deleted'仅在'之前'阵列中)或添加(如ID 1230,' NAME4 - 新')。另请注意,ID虽然唯一,但不按任何特定顺序排序。
所以,我需要找到已经存在的项目 - 添加(可用'在'之后,但不是'之前') - 删除(可用'之前',但不是'之后') - 已更改(两者均可用,因为ID匹配,但名称已更改)
我不能为我的生活找到一种有效的方法来获得Changed元素(最好没有ifs或无关的循环)。 另外,你怎么看? 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);
?>
所以,这就是它。有人知道如何解决这个问题吗?在此先感谢您的帮助!
答案 0 :(得分:0)
将结果填入grep "<record>" file.xml | wc -l
&amp; $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);
更新:做了小修补。
答案 1 :(得分:0)
//'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);