Задать вопрос
BorisT
@BorisT

Странное поведение unset и array_walk

$array = array('A', 'B', 'C', 'D', 'E', 'F', 'G');

$newArray = array();

array_walk($array, function ($v, $k) use (&$array, &$newArray) {

        $newArray[$k] = $v;
        unset($array[$k]);

});

var_dump($array, $newArray);

// Результат:
array (size=3)
  1 => string 'B' (length=1)
  3 => string 'D' (length=1)
  5 => string 'F' (length=1)

array (size=4)
  0 => string 'A' (length=1)
  2 => string 'C' (length=1)
  4 => string 'E' (length=1)
  6 => string 'G' (length=1)


Чем объяснить такое поведение? PHP 5.4.12 (на 5.3 так же).
  • Вопрос задан
  • 3141 просмотр
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
DeusModus
@DeusModus
<?
$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 правильно подсказывает.
Код выше делает то, что вы ожидали.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AMar4enko
@AMar4enko
Вполне ожидаемая история из-за модификации массива во время его итерации.
Вы встали на элемент A, запихали его в новый массив, удалили А из массива, попросили следующий элемент.
А массив-то уже изменился, элемента А нет, текущий элемент уже В. И итератор даст вам следующий элемент, т.е. С
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы