这是最终的代码,感谢 Alexey:
$immovable = array(2);
$current = array(1,2,8,3,4,5,6);
$new = array(2,7,6,5,4,3,1);
$additions = $additionsCopy = array_diff($new, $current);
foreach($additions as $key => $addition) {
$after = array_key($new, $addition)-1;
$additions[$key] = array(
'value' => $addition,
'after' => ($after < 0 ? 0 : $new[$after])
);
}
for($key = 0; $key < count($new); $key++) {
if(in_array($new[$key], $additionsCopy))
$new = array_remove($new, $key--);
}
$removals = array_diff($current, $new);
for($key = 0; $key < count($current); $key++) {
if(in_array($current[$key], $removals))
$current = array_remove($current, $key--);
}
$lastImmovable = -1;
foreach($new as $key => $item) if(in_array($item, $immovable))
$lastImmovable = $key;
$prev = $lastImmovable < 0 ? 0 : $new[$lastImmovable];
foreach($new as $key => $item) if (!in_array($item, $immovable)) {
$moves[] = array('value' => $item, 'after' =>$prev);
$prev = $item;
}
此时我们可以执行$removals
,$moves
那么$additions