php-如何列出两个数组之间的差异

php-如何列出两个数组之间的差异,php,laravel,Php,Laravel,我需要列出更新数组后的差异: $current = [1, 2, 3]; $new = [3, 4, 5]; 列表示例: - number 1 removed - number 2 removed - number 3 keep - number 4 added - number 5 added 如何在PHP/Laravel上执行此操作?使用解决 $fullDiffs = array_merge(array_diff($current, $new), array_diff($new,

我需要列出更新数组后的差异:

$current = [1, 2, 3];
$new     = [3, 4, 5];
列表示例:

- number 1 removed
- number 2 removed
- number 3 keep
- number 4 added
- number 5 added
如何在PHP/Laravel上执行此操作?

使用解决

$fullDiffs = array_merge(array_diff($current, $new), array_diff($new, $current));

foreach($fullDiffs as $i => $id){
  if(in_array($id, $current) && in_array($id, $new)){
    // keep it
  }
  if(in_array($id, $current) && !in_array($id, $new)){
    // remove it
  }
  if(!in_array($id, $current) && in_array($id, $new)){
    // add it
  }
}
不同的方法

$current = [1, 2, 3];
$new = [3, 4, 5];

//initial variables
$list = [];
const ADDED = 1;
const KEPT = 2;
const DELETED = 3;
const STATUSES = array(
    ADDED => 'added',
    KEPT => 'kept',
    DELETED => 'deleted',
);

//populate $list array with elements of your old/new arrays with corresponding action performed
$list = array_fill_keys(array_diff($new, $current), ADDED);
$list += array_fill_keys(array_intersect($current, $new), KEPT);
$list += array_fill_keys(array_diff($current, $new), DELETED);

//you can sort your array here
ksort($list);

//output actions in your array
foreach ($list as $number => $action) {
    printf("- number %d %s\n", $number, STATUSES[$action]);
}
输出:

- number 1 deleted
- number 2 deleted
- number 3 kept
- number 4 added
- number 5 added
number 1 removed.
number 2 removed.
number 3 kept.
number 4 added.
number 5 added.
由于这看起来与Tajni的方法类似,因此这里有一个替代的单行程序(没有键排序):


利用并执行一些迭代来显示所需的文本。您可以将切换减少为如下内容:
printf(“编号%d%s”,$number,[ADDED=>'ADDED',keep=>'keep',DELETED=>'DELETED'][$action])@Progrock,没错。谢谢你的建议!这里的方法与Tajni之前的答案几乎相同。
number 1 removed.
number 2 removed.
number 3 kept.
number 4 added.
number 5 added.
<?php
foreach (
    array_replace(
        ...array_map(
            'array_fill_keys', 
            [$current, $new, array_intersect($current, $new)], 
            ['removed', 'added', 'kept']
        )
    )
    as $n => $outcome)
{
    echo "number $n $outcome.\n";
}