【问题标题】:Array difference from two arrays and detect the changes两个数组的数组差异并检测变化
【发布时间】:2016-08-30 20:58:21
【问题描述】:

我想检测新数组中的旧/新值。

仅供参考,我正在使用 PHP。

我想以最少的编码来实现它,而不需要额外的 for 循环。

旧数组

$oldArr = [
    0 => 1,
    1 => 5,
    2 => 4,
    3 => 9
];

新数组

$newArr = [
    0 => 1,
    1 => 5,
    2 => 6,
    3 => 7
];

$newArr 应该如下所示。

期望的输出

Array
(
    [0] => Array
        (
            [value] => 1
            [action] => not changed
        )
    [1] => Array
        (
            [value] => 5
            [action] => not changed
        )
    [2] => Array
        (
            [value] => 6
            [action] => added
        )

    [3] => Array
        (
            [value] => 7
            [action] => added
        )

    [4] => Array
        (
            [value] => 4
            [action] => removed
        )

    [5] => Array
        (
            [value] => 9
            [action] => removed
        )

)

尝试过的代码

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

【问题讨论】:

  • 那么您为实现这一目标做了什么尝试?
  • @Epodax:我正在尝试用函数而不是循环来实现它,但我不知道用最少的编码来实现它,顺便说一句,我也编辑了我的答案。跨度>
  • $result = array_merge( array_map(function($value) { return ['value' => $value, 'action' => 'unchanged']; }, $unchanged), array_map(function($value) { return ['value' => $value, 'action' => 'added']; }, $added), array_map(function($value) { return ['value' => $value, 'action' => 'removed']; }, $removed) );
  • @Epodax:你有没有看到我更新的问题,我尝试了什么以及我想要什么以及如何实现?

标签: php arrays optimization


【解决方案1】:

使用array_combinearray_merge函数的解决方案:

$removed = [];
$keys = ['value', 'action'];

foreach ($newArr as $k => &$v) {        
    if ($newArr[$k] == $oldArr[$k]) {
        $v = array_combine($keys, [$v, 'not changed']);
    } else {
        $v = array_combine($keys, [$v, 'added']);
        $removed[] = array_combine($keys, [$oldArr[$k], 'removed']);
    }
}
$newArr = array_merge($newArr, $removed);

print_r($newArr);  // will show the needed output

DEMO link

【讨论】:

    【解决方案2】:

    使用array_merge

    $arrayDiff = array_merge($newArr,(array) $oldArr);
    

    【讨论】:

      【解决方案3】:

      这将解决您的问题:

      $var = array_merge (array_diff($first_array, $second_array), array_diff($second_array, $first_array));   
      

      【讨论】:

      • 请查看所需的输出。
      猜你喜欢
      • 1970-01-01
      • 2017-04-11
      • 2019-05-02
      • 2014-07-15
      • 1970-01-01
      • 2020-06-26
      • 2019-05-26
      • 1970-01-01
      相关资源
      最近更新 更多