изменить начальный массив внутри цикла foreach?
19146 просмотра
5 ответа
я хочу иметь цикл foreach, где исходный массив изменяется внутри цикла.
например.
$array = array('red', 'blue');
foreach($array as $key => $value) {
$array[] = 'white';
echo $value . '<br />';
}
в этом цикле цикл напечатает красный и синий, хотя я добавляю еще один элемент внутри цикла.
Есть ли способ изменить начальный массив внутри цикла, чтобы новые элементы были добавлены и foreach будет использовать новый массив независимо от того, что изменилось?
мне нужна такая логика для конкретной задачи:
у меня будет заявление if, которое ищет ссылку. если эта ссылка существует, она добавляется в массив. содержание ссылки будет выбрано для проверки, если оно содержит другую ссылку. если это так, эта ссылка добавляется, и содержимое будет извлечено, и так далее ... когда ссылка не будет найдена, цикл foreach завершится
Автор: ajsie Источник Размещён: 13.11.2019 11:47Ответы (5)
45 плюса
Я не думаю, что это возможно с foreach
циклом, по крайней мере, так, как вы написали: кажется, не просто так foreach
работает; цитируя справочную страницуforeach
:
Примечание. Если ссылка на массив не указана, foreach работает с копией указанного массива, а не с самим массивом.
Редактировать: подумав немного об этой заметке, это на самом деле возможно, и вот решение:
В записке написано « Если на массив не есть ссылки »; что означает, что эта часть кода должна работать:
$i = 0;
$array = array('red', 'blue');
foreach($array as $key => & $value) {
$array[] = 'white';
echo $value . '<br />';
if ($i++ >= 5) {
break; // security measure to ensure non-endless loop
}
}
Обратите внимание на &
ранее $value
.
И это на самом деле отображает:
red
blue
white
white
white
white
Что означает добавление, &
которое на самом деле является решением, которое вы искали, для изменения массива внутри foreach
цикла ;-)
Изменить: и вот решение, которое я предложил, прежде чем думать об этой заметке:
Вы можете сделать это, используя while
цикл, выполняя немного больше работы «вручную»; например :
$i = 0;
$array = array('red', 'blue');
$value = reset($array);
while ($value) {
$array[] = 'white';
echo $value . '<br />';
if ($i++ >= 5) {
break; // security measure to ensure non-endless loop
}
$value = next($array);
}
Вы получите этот вывод:
red
blue
white
white
white
white
Автор: Pascal MARTIN
Размещён: 27.02.2010 04:47
8 плюса
Вам нужно переместить присваивание внутри цикла for и проверять длину массива каждую итерацию.
$array = array('red', 'blue');
for($i = 0; $i < count($array); $i++)
{
$value = $array[$i];
array_push($array, 'white');
echo $value . '<br />';
}
Будьте осторожны, это вызовет бесконечный цикл (белый будет добавляться в конец массива в каждом цикле).
Автор: MrValdez Размещён: 27.02.2010 04:454 плюса
Может быть, вы должны использовать другой способ, например:
$ar = array('blue', 'red');
while ($a = array_pop($ar) {
array_push($ar, 'white');
}
Или как то так ...
Автор: Enrico Carlesso Размещён: 27.02.2010 04:461 плюс
Вы можете получить доступ к массиву, используя ключ $
$array = array('red', 'blue');
foreach($array as $key => $value) {
$array[$key] = 'white';
}
Автор: freelivenet
Размещён: 20.09.2013 10:36
1 плюс
Для того , чтобы иметь возможность непосредственно изменять элементы массива в пределах предшествуют контур
$value
с&
. В этом случае значение будет присвоено по ссылке . [источник]
Все, что вам нужно сделать, чтобы ваш старый код
предшествовать
$value
с&
вот так
$array = array('red', 'blue');
foreach($array as $key => &$value) {// <-- here
$array[] = 'white';
echo $value . '<br />';
}
Цикл while был бы лучшим решением.
while (list ($key, $value) = each ($array) ) {
$array[] = 'white';
echo $value . '<br />';
}
Если вам не нужна переменная $ key, как показывает ваш пример, используйте $value = array_pop($array)
вместо list ($key, $value) = each ($array)
нее вариант if, который будет менее дорогим. см @ Энрико-Carlesso в ответ здесь
Поскольку ваш массив является последовательным (числовым, индексированным) и не ассоциативным, вы можете for
вместо этого использовать цикл.
for ($key = 0; $key < count($array); ++$key) {
$value = $array[$i];
$array[] = 'white';
echo $value . '<br />';
}
Как примечание стороны.
Я не понимаю, почему это так &$value
и нет &array
.
&$value
Предполагается, что вы можете изменить только текущий элемент в цикле.
&array
Предполагается, что вы можете изменить все элементы массива в цикле, включая добавление / удаление элемента.
Вопросы из категории :
- php Как вы отлаживаете PHP-скрипты?
- php Заставьте XAMPP / Apache обслуживать файл вне htdocs
- php Как включить файлы PHP, которые требуют абсолютного пути?
- php Скрипт входа со скрытыми кнопками
- php How can I find unused functions in a PHP project
- php Эффективное изменение размера JPEG изображения в PHP
- php MySQL или PDO - каковы плюсы и минусы?
- php Как бы вы внедрили аутентификацию на основе FORM без резервной базы данных?
- php Самый простой способ профилировать скрипт PHP
- php Изображения в PHP
- php PHP эквивалент .NET / Java toString ()
- php В чем разница между | и || или операторы?
- php Пул соединений в PHP
- php PHP выполнить фоновый процесс
- php htmlentities () против htmlspecialchars ()
- php Генерирование (псевдо) случайных буквенно-цифровых строк
- php Какой лучший способ получить дробную часть числа с плавающей точкой в ??PHP?
- php Как реализовать кеш HTML для сайта PHP?
- php Как я могу предотвратить SQL-инъекцию в PHP?
- php PHP: Как расширить / сжать Tinyurls