Странное поведение unset и array_walk
Вполне ожидаемая история из-за модификации массива во время его итерации.
Вы встали на элемент A, запихали его в новый массив, удалили А из массива, попросили следующий элемент.
А массив-то уже изменился, элемента А нет, текущий элемент уже В. И итератор даст вам следующий элемент, т.е. С
<?
$array = array('A', 'B', 'C', 'D', 'E', 'F', 'G');
$arrayForWalking = $data;

$newArray = array();
array_walk($arrayForWalking, function ($v, $k) use (&$array, &$newArray) {
    $newArray[$k] = $v;
    unset($array[$k]);
});
var_dump($array, $newArray);


AMar4enko правильно подсказывает.
Код выше делает то, что вы ожидали.