Intereting Posts
Заполнение поля со значениями из другого поля PHP mail () сервер функции и localhost не работает Разделить строку на равные части с помощью PHP Отправка дополнительной переменной на сервер с помощью dataUrl Как щелчок кнопки может изменить содержимое раскрывающегося меню? Ограничения ключей (индексов) ассоциативного массива PHP? Как зашифровать пароль перед отправкой из формы входа? Как скрыть URL от пользователей при отправке этой формы? MongoDb: Преимущества использования ObjectID vs строки, содержащей Id? Распаковать папку для распаковки файлов Проблемы с удалением index.php в CodeIgniter 3 Можно ли получить время UNIX с такой даты? 2011-02-27 02:04:46? Почему POST устанавливается при перезагрузке? Как проверить, существует ли класс в пространстве имен? Неустранимая ошибка: вызов функции-члена get () для не-объекта в C: \ wamp \ www \ ci \ application \ models \ site_model.php в строке 6

Почему я не могу отключить переменную в цикле `foreach`?

Почему я не могу отключить переменную в цикле foreach ?

 <?php $array = array(a,s,d,f,g,h,j,k,l); foreach($array as $i => $a){ unset($array[1]); echo $a . "\n"; } print_r($array); с <?php $array = array(a,s,d,f,g,h,j,k,l); foreach($array as $i => $a){ unset($array[1]); echo $a . "\n"; } print_r($array); 

В коде переменная находится в области видимости внутри цикла foreach , но вне цикла она не установлена. Можно ли отключить его в цикле?

Вам нужно передать массив по ссылке, например:

 foreach($array as $i => &$a){ 

Обратите внимание на добавленную & . Это также указано в руководстве foreach :

Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед значением $ value нужно указать &. В этом случае значение будет присвоено по ссылке.

Теперь это производит :

 a d f g h j k l Array ( [0] => a [2] => d [3] => f [4] => g [5] => h [6] => j [7] => k [8] => l ) 

foreach выполняется на копии массива, а не на ссылке, чтобы было легче справляться с более резкими изменениями в массиве (например, вашими) во время выполнения.

foreach выполняет итерацию по массиву и назначает ключ $ i и значение $ a перед доступом к кодовому блоку внутри цикла. Массив фактически «скопирован» функцией перед повторением, поэтому любые изменения исходного массива не влияют на прогрессию цикла.

Вы также можете передать массив $ по ссылке в foreach, используя $i => &$a вместо значения, которое позволит мутации массива.

Другим вариантом было бы работать непосредственно с массивом, и вы увидите что-то другое:

 for($x=0;$x<count($array);$x++){ unset($array[1]); // for $x=1 this would result in an error as key does not exist now echo $array[$x]; } print_r($array); с for($x=0;$x<count($array);$x++){ unset($array[1]); // for $x=1 this would result in an error as key does not exist now echo $array[$x]; } print_r($array); 

Конечно, это предполагает, что ваш массив численно и последовательно.