繁体   English   中英

比较多维数组中的更改-PHP

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM