Прямо сейчас я пытаюсь напечатать числа между двумя диапазонами: от 1 до 48 и от 114 до 118, используя цикл for. Я попробовал сделать следующее:
for ($y = 1; $y < 48; $y++) { }
Цикл правильно напечатал числа в диапазоне от 1 до 48. Но у меня нет четкого представления о том, как применить второй диапазон от 114 до 118 для печати чисел 115, 116 и 117 в другом диапазоне.
Я хочу напечатать числа как 1,2,3,..............45,46,47,115,116,117 Кто-нибудь может мне помочь в этом?
Или манипулируйте переменной-счетчиком изнутри цикла... for ($y = 1; $y < 118; $y++) { if ($y == 48) { $y = 115; } echo $y, ", "; }
(Обычно это не рекомендуется, потому что это может привести к неожиданному поведению при выполнении более сложных задач. Но для чего-то столь тривиального это сработает нормально.)
Вот простая фраза: echo implode(', ', [...range(1, 48), ...range(114, 118)]);
. Демо: 3v4l.org/V4DjK Это неэффективно, но просто в использовании для небольшого количества диапазонов.
Вы можете определить функцию и вызвать ее дважды: 3v4l.org/fRMAI
«числа между двумя диапазонами» вряд ли имеют смысл. Это может быть ЛИБО «диапазон между двумя числами», ИЛИ «из двух диапазонов». А цифры из этих диапазонов вам видимо НЕ нужны.
Один из способов: используйте условный оператор, чтобы напечатать то, что вы хотите включить.
<?php
for ($y=1; $y <= 118; $y++) {
if (($y>=1 && $y<=48) || ($y>=115 && $y <=117)) {
echo $y . " " ;
} else {
// do nothing -- or other things you want
}
}
?>
Смотрите демо
Мне нравится иметь в своем коде 70 //do nothing
циклов.
Этот принятый ответ не выводит число 118.
@KIKOSoftware, ОП дважды упомянул в своем вопросе, что последнее отображаемое число — 117 (а не 118), но он также прямо упомянул, что второй диапазон — от 114 до 118, но цифры, которые нужно напечатать, — только 115, 116, 117 (поэтому я включил блок else, чтобы он мог делать все, что захочет, для 114 и 118).
<?php
for ($y = 1; $y < 118; $y++) {
if (($y >= 1 && $y < 48) || ($y >= 115 && $y < 118)) {
echo $y . ",";
}
}
?>
Благодарим вас за вклад в сообщество Stack Overflow. Возможно, это правильный ответ, но было бы очень полезно предоставить дополнительные пояснения к вашему коду, чтобы разработчики могли понять ваши рассуждения. Это особенно полезно для новых разработчиков, которые не так хорошо знакомы с синтаксисом или пытаются понять концепции. Не могли бы вы отредактировать свой ответ, включив в него дополнительную информацию на благо сообщества?
Для решения, которое одновременно эффективно и легко читается, вы можете использовать что-то вроде этого:
foreach ([...range(1, 48), ...range(114, 118)] as $number) {
echo "$number ";
}
При этом используются range() , оператор ...
, краткая запись массива и foreach.
Смотрите: https://3v4l.org/l8ril
Создание трех массивов не особенно эффективно...
@Оливье Оливье Ты совершенно прав. Два цикла for
были бы более эффективными. Я противопоставлял комментарий Маркуса Целлера (см. вопрос), исключив функцию implode()
. При всем при этом я не думаю, что здесь важна эффективность, важна читаемость.
Я использовал implode, потому что похоже, что ему нужен список, разделенный запятыми. Но если вам просто нужен пробел или новая строка, вариант implode все равно подойдет :) echo implode(PHP_EOL, [...range(1, 48), ...range(114, 118)]);
. Цикл foreach добавит в конце дополнительный разделитель/пробел/новую строку, что может быть нежелательно.
@Olivier В быстром тесте это решение выглядит эффективным (цикл 100 тыс.). Это хорошая идея и приятно появиться здесь среди других ответов.
@bobblebubble Проверьте это и увидите, что решение, которое я предложил в комментариях, более эффективно (и в то же время прекрасно читаемо).
Я как раз собирался это написать идея из вашего комментария выглядит наиболее эффективной (и читабельной, как вы говорите). Возможно, добавьте еще один ответ!
Можно сделать две петли
for
подряд. Также обратите внимание на range(). Посмотрите примеры.