【问题标题】:Get added/removed/changed key=>value pairs between two arrays获取两个数组之间添加/删除/更改的键=>值对
【发布时间】:2017-10-05 06:10:34
【问题描述】:

我有两个称为 $old 和 $new 的多维数组。我想比较这两个数组,看看两者之间添加、删除或更改了哪些 k=>v。

这些是数组:

$old = array(
    'ONE'   => array('a' => 1, 'b' => 2, 'c' => 3),
    'TWO'   => array('a' => 4, 'b' => 5, 'c' => 6),
    'THREE' => array('a' => 7, 'b' => 8, 'c' => 9)
);

$new = array(
    'TWO'   => array('a' => 5, 'b' => 5, 'c' => 6),
    'THREE' => array('a' => 7, 'b' => 8, 'c' => 9),
    'FOUR'  => array('a' => 1, 'b' => 2, 'c' => 3)
);

请注意,在 $new 数组中,我删除了“ONE”,添加了“FOUR”,并将“TWO”=>“a”的值从 4 更改为 5。

这是我当前(工作)的解决方案,但我觉得我不需要编写这么多代码,而且我不确定在更大的数组上它是否会很慢。

$added = array();
$removed = array();
$changed = array();

foreach ($old as $old_key => $old_value) {
    if (!in_array($old_key, array_keys($new))) {
        $removed[] = $old_value;
        unset($old[$old_key]);
    }
}

foreach ($new as $new_key => $new_value) {
    if (!in_array($new_key, array_keys($old))) {
        $added[] = $new_value;
        unset($new[$new_key]);
    }
}

$changed = array_udiff($new, $old, create_function(
    '$a,$b',
    'return strcmp(implode("", $a), implode("", $b));'
));

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    您可以使用array_diff_key 轻松查找已添加或删除的项目:

    $removed = array_diff_key($old, $new);
    $added = array_diff_key($new, $old);
    

    要找出哪些项目发生了变化,您可以先使用array_intersect_key 缩小可能的候选范围并直接比较数组以查看发生了什么变化:

    $possiblyChanged = array_intersect_key($old, $new);
    foreach ($possiblyChanged as $key => $value) {
        if ($new[$key] !== $value) {
             $changed[$key] = $value;
        }
    }
    

    【讨论】:

    • 我知道必须有一种方法可以使用更多的内置函数。感谢您快速而完整的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2017-04-07
    • 2011-04-23
    相关资源
    最近更新 更多