Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
Если входные условия поменяются, и нужно будет найти все чётные числа от 344, то число 344 будет пропущено, а проверяться сразу будет 345. Аналогично с верхней границей, если было бы 358, то оно тоже было бы пропущено. Переделайте алгоритм так, чтобы граничные значения тоже учитывались.
Так неправильно:
if ($i % 2) { }
else { $arr[] = $i;}
Правильно вот так:
if ($i % 2 === 0) {
$arr[] = $i;
}
Во-первых, ни в коем случае не должно быть пустых блоков. Можно инвертировать условия с помощью логического НЕ (оператор !). То есть не писать:
if ($x) {
//это мне ни к чему
} else {
//а вот здесь я что-то сделаю
}
А писать:
if (!$x) {
//здесь я что-то сделаю
}
Здесь вы посмотрели, что если $i делится на 2 с остатком (остаток - 1, будет преобразовано в true), то это не то что вам нужно. И добавили else и его уже обработали.
Хотя можно было сделать просто подходящее условие - если остаток от деления на 2 равен 0.
Блоки if всегда нужно писать в виде:
if (условие) {
//то
}
Никаких в одну строку и прочих лишних переносов.
Один отступ всегда должен быть равен четырем пробелам. А у вас echo пляшут как хотят. Используйте автоформатирование в PHPStorm - одновременное нажатие CTRL+ALT+L
Поправьте эти небольшие недочёты и попробуйте снова.
В 1. Нет, 344 также попадет под условия и будет внесено в массив. Также, если у величить сравнение с 358, то значение 358 тоже будет внесено и выведено.
У вас всё хорошо и с логикой и с алгоритмами. Есть только небольшая проблема со стилем кода и названиями переменных. То что находится внутри фигурных скобок нужно выносить на отдельные строки. Вот так:
if (условие) {
действие
}
Переменную $i лучше назвать $from. $i1 лучше назвать $to.
При добавлении новых элементов в массив в конструкции между именем массива и квадратными скобками не должно быть пробелов. Вот так:
$arr[] = 123;
Позже напишу отдельную статью по этой теме. И еще раз - с задачей вы справились на все 100%. Кодстайл - это уже профессиональный уровень, но будет хорошо если вы уже сейчас начнете писать следуя этим правилам. Это даст вам преимущество.
Тут всё гуд) Потенциально может возникнуть ошибка, если вместо 357 мы захотим установить границу 358. Более надежным и универсальным условием будет меньше либо равно:
После изменение значения max_execution_time с 180 на 1 сервер так же продолжает выполнение кода с бесконечных единичек, а не завершает работу скрипта через 1 секунду. В чем проблема? Или я не так что-то понял?
Понравилось домашнее задание. Но сначала раза 2 проверил себя по уроку. С директивой max_execution_time почитал, но если я ставлю ее 1 мс у меня вообще не открывается страничка, а так по умолчанию стояло 180.
Второе: Привел этот код к тому, что 1 выводится бесконечно. Цикл выполняется всегда, т.к. в его условии всегда остается истина.
Далее я изучила max_execution_time и если правильно поняла, то это время выполнения скрипта.
При изменении на 1 секунду выдает ошибку через секунду (Fatal error: Maximum execution time of 1 second exceeded).
Эээ.. выполнение скрипта затрачивает больше времении поэтому останавливается аварийно?
Код из домашнего задания приводит к зацикливанию, т.к. условие всегда будет выполняться. Директива max_execution_time задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться, иначе выдаст ошибку.
Сори, только сейчас заметил что форма отправки верху. А я снизу обыскался. Лента комментов растягивается, было бы логично продублировать форму добавления комментов вниз при n >10
У меня так на моих сайтах :))
P.S. и еще, если сразу код в правильно в теги кода не заключил, то все - при редактировании уже не показывает плашку BB кодов
Переменная n не проинициализирована. В самый первый раз, где она используется в качестве ключа массива будет ошибка! Ведь такой переменной ещё нет. И не нужна она вам. Добавляйте элементы в массив без использования ключа.
1
$arr3 = [];
$num = 345;
while($num<357) {
$num++;
if($num%2===0) {
$arr3[] = $num;
}
}
foreach($arr3 as $index => $speed) {
echo $index . ' ' . $speed . '<br>';
}
2
не стоит этого делать будет бесконечно выводить 1 пока не зависнет страница
3
задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться.
`4 выводит n-количество 1 и останавливается``
max_execution_time задает максимальное время в секундах (int), в течение которого скрипт должен полностью загрузиться. Если этого не происходит, работа скрипта завершается. Помогает исключить зависания при корявом коде. По умолчанию - 30 секунд. Если PHP запущен из командной строки, это значение по умолчанию равно 0.
Вот на задаче с перебором массива я убедился окончательно, что программирование не всем дано) Солидарен с [email protected]. Тоже не осилил. А из ответов в комментариях понял, что сложного ничего не было. Артём, какие толковые ресурсы для практики Вы бы могли порекомендовать ещё? Просто ясно, что если это не пойму, дальше не смогу двигаться нормально.
//С помощью цикла while создайте массив, содержащий чётные числа от 345 до 357. Затем выведите элементы массива с помощью цикла foreach.
$i = 345;
$arr = [];
while ($i <= 357) {
if ($i % 2 == 0) {
$arr[]=$i;
}
$i++;
}
foreach ($arr as $elem){
echo $elem."\n";
}
//2ое задание: Цикл будет бесконечным ( в данном случае скрипт проработает 30 секунд, после чего автоматически прекратит работать). Если поставить значение max_execution_time = 1, то скрипт прекратит работу через 1 секунду.
<?php
$i=345;
$mass=[];
while ($i<357) {
if ($i %2 == 0) {
$mass[] = $i;
}
$i++;
}
var_dump($mass);
?>
2ое задание - это бесконечный цикл.
при max_execution_time 1 секунда получаем: Fatal error: Maximum execution time of 1 second exceeded in W:\domains\myproject.loc\www\content.php on line 3
Поправьте отступы, почему всё пляшет? В PhpStorm можно нажать Ctrl+Alt+L и оно само исправится.
Не вижу второго цикла foreach. Перечитайте ДЗ.
Число 357 тоже должно проверяться. Верхняя граница может измениться, а код должен продолжить работать. Изменим, например, на 358, а оно не будет проверяться. Исправьте это.
// С помощью цикла while создайте массив, содержащий чётные числа от 345 до 357. Затем выведите элементы массива с помощью цикла foreach.
$i = 345;
$evenArray = [];
while ($i <= 357) {
if ($i % 2 == 0) {
$evenArray[] = $i;
}
$i++;
}
foreach ($evenArray as $number) {
echo $number . '<br>';
}
Запустите следующий код: while (true) { echo 1; }. К чему это привело? К бесконечному циклу и выводу единиц.
Изучите, для чего нужна директива max_execution_time в файле конфигурации php.ini и установите её равной одной секунде. Снова запустите этот код. Эта директива устанавливает максимальное время загрузки скрипта. В случае превышения лимита, парсер завершает работу данного скрипта.
После изменения конфигурации вылез фатал еррор: Maximum execution time of 1 second exceeded in C:\OpenServer\domains\myproject.loc\arrays.php on line 3
$startNumber = 345;
$addArray = [];
while ($startNumber <= 357) {
if ($startNumber % 2 == 0) {
$addArray[] = $startNumber;
}
$startNumber++;
}
foreach ($addArray as $number) {
echo $number . '</br>';
}
код:
<?php
while (true) {
echo 1;
}
К чему это привело? к постоянному выполнению тела цикла.
директива max_execution_time нужна для указания времени для полной загрузки скрипта.Если загрузка заняло более времени то загрузка прекращается.
Привело к бесконечному циклу и зависанию сервера.
Директива max_execution_time решает проблему плохо написанного скрипта, как в нашем случае =) и задает значение 1 секунды, за это время скрипт должен полностью загрузиться.
Запустил код заново, вышла ошибка fatal error, которая говорит, что максимальное время выполнения превышено.
К чему привело? Комп тупит 60 сек, а потом выполнение прерывается.
php.ini редактируется в ЛКМ на флажок в трее -> Дополнительно -> Конфигурация -> PHP
Находишь строку с max_execution_time и там сколько поставишь, столько и будет тупить комп.
Подозреваю, что дробное число секунд нельзя ставить, или я не прав?
max_execution_time = (int)(default = 30) | Настройка в php.ini
Эта настройка позволяет менять значение нагрузки скрипта по умолчанию (30 с), тем самым помогает работать со скоростью работы скрипта.
Если за указанное время не произошла загрузка скрипта то парсер завершает свою работу :3
При указаний в настройке значение равное 1, скрипт начал загружаться быстрее :)
Скобки и отступы пляшут, перед отправкой сюда в шторме нажимайте ctrl+alt+L, а еще лучше привыкайте сразу писать правильно.
По алгоритму - всё ок.
Закрывающий тег ?> в конце не нужен!
произойдёт зацикливание, т.е. скрипт не сможет выйти из цикла.
Директива max_execution_time задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться, при выставлении 1 секунда выдаст сообщение:
"Fatal error: Maximum execution time of 1 second exceeded in C:\OSPanel\domains\myproject.loc\www\index.php on line 4", что говорит о том что скрипт в течении 1 секунды полностью не загрузился и "завис" на четвёртой строчке кода.
На сколько секунд лучше выставлять эту директиву?
Отлично. Значение директивы сильно зависит от проекта. Если мы точно знаем, что сайт отвечает не дольше секунды, значит и значение нужно выставить соотвествующее.
<?php
//С помощью цикла while создайте массив,
// содержащий чётные числа от 345 до 357.
// Затем выведите элементы массива с помощью цикла foreach.
$numbers = 345;
while ($numbers >= 345 and $numbers <= 357) {
if ($numbers % 2 == 0) {
$arrayNumbers[] = $numbers;
}
$numbers++;
}
foreach ($arrayNumbers as $i) {
echo $i;
echo "<br>";
}
<?php
while (true) {
echo 1;
}
приводит к бесконечному выводу единицы, после смены директивы у меня ничего не поменялось, что я мог сделать не так?
Запустил код, это привело к бесконечному зацикливанию кода и выводу единиц.
Директива max_execution_time задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, парсер завершает работу скрипта. Этот механизм помогает предотвратить зависание сервера из-за плохо написанного скрипта.
Файл изменил. Код запустил, через несколько секунд выдало ошибку и код прекратился выполняться.
Таким образом мы ограничиваем время для выполнения скрипта, чтобы в случае зацикливания или зависания не было бесконечной загрузки.
А вот так написано в официальной документации, которая непойми какая. Думаю это слово можно заменить на сервер? Или лучше так: "Если этого не происходит то скрипт завершает свою работу".
<?php
$a = 345;
$arr = [];
while ($a <= 357) {
if ($a % 2 == 0) {
$arr[] = $a;
}
$a++;
}
foreach ($arr as $even) {
echo 'четное число ' . $even;
echo '<br>';
}
Выполнение
while (true) {
echo 1;
}
привело к множественному числу 1.
После Гугления max_execution_time стало очевидно, что эта директива отвечает за время исполнения скрипта. По идее, изменение ее значения на 1 должно привести к прерыванию скрипта через 1 секунду. Но мне не свезло. По твоему совету к одному из предыдущих комментариев к этому уроку, загуглил функцию sleep. Выставив ее значение на 1, цикл выполнялся 1 секунду. Успев нарисовать две единицы, он перестал выполнятся c появившейся строкой " Fatal error: Maximum execution time of 1 second exceeded "
Я изменил max_execution_time на 1 секунду, однако ничего не поменялось, скрипт продолжал бесконечно работать. (После редактирования php.ini я сохранил настройки и перезапустил сервер). Полагаю после изменения max_execution_time на 1 секунду, скрипт должен завершить свою работу в течении 1 секунды.
После запуска кода сервер вывел бесконечное число единиц. Директива max_execution_time нужна для изменения времени выполнения скрипта, само слово _execution_говорит об этом. Но после установки на 1 секунду сервер просто затупил. Я читал ,что в принципе так делать нельзя. Бесконечная работа скрипта приводит к зависанию сервера.
А насчет другого задания, то без изменения значения единицы выводятся бесконечно. Если же изменить значение max_execution_time на 1, то через несколько секунд выдается Fatal error. Нужна эта директива для ограничения времени выполнения скрипта. Но у меня есть немного глупый вопрос. Все-таки в первом случае единицы загружаться прям бесконечно не будут, выполнение кода через некоторое время будет остановлено, но при этом ошибка не выводится (по крайней мере у меня так со значением 60 и 30). Почему так? Мне идти читать документацию?
<?php
$min = 345;
$max = 357;
while ($min <= $max) {
if ($min % 2 == 0) {
$array [] = $min;
}
$min++;
}
foreach ($array as $value) {
echo $value . '<br >';
}
<?php
while (true) {
echo 1;
} - привело к бесконечному выводу 1
изменил в мампе max_execution_time на 1 - все равно почему то бесконечный цикл
программа будет бесконечно выводить единицу, пока не выдаст ошибку (хотя у меня не вывела, а просто прекратила загружать по прошествии времени).
Если поменять значение на единицу, то ошибка должна выдаваться сразу через секунду. Но у меня продолжает грузить бесконечное число единиц, несмотря на перезагрузку сервера. Судя по комментариям, не у одной меня такая проблема, но она так и осталась без ответа =D
Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.
Хорошо, учту на будущее) Но к слову, в уроке "Условия в PHP" в разделе про тернарный оператор написано, что он представляет собой сокращенную форму конструкции if-else, что тоже получается не совсем корректно =)
И насчет max_execution_time, это проблема моего браузера получается или какая-то другая причина?
Дело в том, что скрипт завершается через секунду, но за эту секунду он умудряется нагенерить очень много единиц. Настолько много, что вкладка браузера просто зависает.
1-ое задание неверно сделано, перечитайте. По-хорошему внутри цикла должна быть проверка. И делайте код сразу таким, чтобы он оставался рабочим, даже если входные числа 345 и 347 заменятся другими.
<?php
$q = 345;
$p = [];
//на этом этапе у нас выведутся числа от 345 до 357.
while ($q <= 357) {
echo $q;
if ($q % 2 == 0) {
$p[] = $q;
}
$q++;
echo '<br>';
}
/*после цикла foreach мы увидим только чётные числа
от 345 до 357*/
echo '<br><br>';
foreach ($p as $v) {
echo $v . '<br><br>';
}
/*этот цикл привёл к бесконечно повторяющему числу "1",
до тех пор пока мы не превысили лимит выполнения*/
while (true) {
echo 1;
}
/*eсли установить в конфигурациях php.ini директиву
max_execution_time = 1 вместо = 60. То вылезает
предупреждение Maximum execution time of 1 second exceeded*/
Эта директива задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, парсер завершает работу скрипта. Этот механизм помогает предотвратить зависание сервера из-за плохо написанного скрипта.
Это привело к зацикливанию. Программа заполняет экран единицами. Причина в том, что нет условия, когда программа выходила бы из цикла.
3) Директива max execution time определяет максимальное время, выделяемое на загрузку PHP-скрипта. Мы уменьшили время с 60 секунд на 1 секунду, чтобы снизить время на обработку кода в случае, если он плохо написан.
Результат.
Добавил var_dump($a), чтобы показать, что такой скрипт работает быстрее… Сразу определяется с какого числа из заданного диапазона начинаются четные числа и далее этот диапазон заполняется четными числами ($a += 2;)
Второе
111111111111111111111111111111111111111111111111111111111111111111111
( ! ) Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\ws_lessons\index.php on line 3
Call Stack
# Time Memory Function Location
1 0.2015 356144 {main}( ) ...\index.php:0
max_execution_time в файле конфигурации php.ini установлен равной 30 секундам.
max_execution_time — определяет, как долго PHP-скрипт будет исполняться до того, как он будет принудительно остановлен.
После установки max_execution_time равной 1 секунде
( ! ) Fatal error: Maximum execution time of 1 second exceeded in C:\xampp\htdocs\ws_lessons\index.php on line 3
Call Stack
# Time Memory Function Location
1 0.2019 356144 {main}( ) ...\index.php:0
Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.
Задание о max_execution_time улыбнуло :)
Там тебе и уроки освоения гугла, и опыт зависания системы
и главное - руки больше бездумно совать никуда не охота :)
Второе задание
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Fatal error: Maximum execution time of 1 second exceeded in C:\OPENSERVER\OpenServer\domains\study\arrays.php on line 80
Директива max_execution_time задаёт максимальное время в секундах, в течение которого скрипт должен полностью загрузиться, в противном случае работа скрипта принудительно завершается.
У меня изменения в файле php.ini никак не влияют на выполнение
По остальному: если запустить код с предложенным циклом, то цикл будет бесконечно повторяться. Директива max_execution_time задает время, за которое скрипт должен полностью загрузится, если этого не произойдет, то работа скрипта будет завершена)
Правильно вот так:
Во-первых, ни в коем случае не должно быть пустых блоков. Можно инвертировать условия с помощью логического НЕ (оператор !). То есть не писать:
А писать:
Здесь вы посмотрели, что если $i делится на 2 с остатком (остаток - 1, будет преобразовано в true), то это не то что вам нужно. И добавили else и его уже обработали.
Хотя можно было сделать просто подходящее условие - если остаток от деления на 2 равен 0.
Никаких в одну строку и прочих лишних переносов.
Поправьте эти небольшие недочёты и попробуйте снова.
В 1. Нет, 344 также попадет под условия и будет внесено в массив. Также, если у величить сравнение с 358, то значение 358 тоже будет внесено и выведено.
Всё верно, образцовая работа.
$arr = [];
можно опустить
тоже работает )))
Можно, но лучше писать, так более очевидно.
Всё хорошо, но код лучше оформлять текстом, как я вам и говорил. С помощью markdown-разметки:
```
код
```
Закрывающий тег ?> в конце не нужен.
У вас всё хорошо и с логикой и с алгоритмами. Есть только небольшая проблема со стилем кода и названиями переменных. То что находится внутри фигурных скобок нужно выносить на отдельные строки. Вот так:
Переменную $i лучше назвать $from. $i1 лучше назвать $to.
При добавлении новых элементов в массив в конструкции между именем массива и квадратными скобками не должно быть пробелов. Вот так:
Позже напишу отдельную статью по этой теме. И еще раз - с задачей вы справились на все 100%. Кодстайл - это уже профессиональный уровень, но будет хорошо если вы уже сейчас начнете писать следуя этим правилам. Это даст вам преимущество.
Благодарю Вас за совет. Действительно, нужно быть внимательным к "мелочам", особенно в жизни !
Не получилось в одной строке ваил условия написать для вывода(
А их и не надо в одну строку писать, тут всё правильно и понятно :)
Ну или так, так вроде еще никто не делал)
Не соответствует заданию, так как массив должен содержать только чётные числа
Еще так можно
А здесь у вас бесконечный цикл, вы хоть проверяйте, что оно работает.
Теперь работает))
Другое дело! :)
Тут всё гуд) Потенциально может возникнуть ошибка, если вместо 357 мы захотим установить границу 358. Более надежным и универсальным условием будет меньше либо равно:
Отлично =)
Спасибо за урок!
ААА, ты куда так разогнался, я не успеваю проверять=)
Хорошо, но можно чуть упростить:
То есть не зачем создавать переменную $res - можно сразу проверять.
Да, прет меня от уроков с этого сайта xD
Согласен, был такой вариант, пробовал, но что-то пошло не так, видимо была синтаксическая ошибка. Спасибо:)
1.
Отлично!
тут не сразу понятно что ожидается, лучше сравнивать с нулём - так будет более явно.
Для тела цикла и условий всегда используйте фигурные скобки, даже если там одна строка. В PHP это стандарт.
Спасибо за урок, весьма понятно и доходчиво, отличный проект!
Можно начинать не с нуля, а с 345. И непонятно, почему здесь 350, а не 345.
$i++ не зависит от условия, можно просто в конце каждой итерации делать.
Для блоков if и else всегда используйте фигурные скобки, даже если там одна строка.
После изменение значения max_execution_time с 180 на 1 сервер так же продолжает выполнение кода с бесконечных единичек, а не завершает работу скрипта через 1 секунду. В чем проблема? Или я не так что-то понял?
Попробуйте добавить в цикле паузы в 100 мс и посмотрите на разницу.
У меня аналогичная ситуация. Как добавить паузы в цикле? В уроке об этом ничего не сказано.
А погуглить? Просто как сделать паузу в PHP.
Паузу можно сделать командой sleep (sec). :))))
Или usleep, что в данном случае больше подойдёт
Ок.
Вместо
лучше использовать
Хорошо понимаете синтаксис языка - это похвально. Но в целом решение выглядит переусложненным, можно же просто выводить числа при выполнении условия.
Понравилось домашнее задание. Но сначала раза 2 проверил себя по уроку. С директивой max_execution_time почитал, но если я ставлю ее 1 мс у меня вообще не открывается страничка, а так по умолчанию стояло 180.
По дз - ок. За одну миллисекунду не успеет ничего выполниться.
Понятно, принцип работы директивы ясен.
Отлично
Ок!
А где проверка на чётность? Числа в условии могут поменяться.
Немного добавил от себя чтоб массив нагляднее был
$for - плохое название для массива. Лучше хотя бы $array. Перед циклом стоит его проинициализировать как пустой массив:
Цикл в while(true) вызывает бесконечный цикл. max_execution_time равный 1 позволяет прервать скрипт, если он не выполнился в течении 1 секунды.
Отлично!
Хорошо. Но вместо
лучше все же
Отлично
Первое:
Второе: Привел этот код к тому, что 1 выводится бесконечно. Цикл выполняется всегда, т.к. в его условии всегда остается истина.
Далее я изучила max_execution_time и если правильно поняла, то это время выполнения скрипта.
При изменении на 1 секунду выдает ошибку через секунду (Fatal error: Maximum execution time of 1 second exceeded).
Эээ.. выполнение скрипта затрачивает больше времении поэтому останавливается аварийно?
Отлично, всё верно.
Отлично
Ок
Код из домашнего задания приводит к зацикливанию, т.к. условие всегда будет выполняться. Директива max_execution_time задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться, иначе выдаст ошибку.
Отлично
Отлично
Зачем вы отвечаете к чужим комментариям?
Сори, только сейчас заметил что форма отправки верху. А я снизу обыскался. Лента комментов растягивается, было бы логично продублировать форму добавления комментов вниз при n >10
У меня так на моих сайтах :))
P.S. и еще, если сразу код в правильно в теги кода не заключил, то все - при редактировании уже не показывает плашку BB кодов
не понял нащёт изменения времени выполнения скрипта у меня стояло 180 я изменил на 1 но страница так и осталась грузится,может я что то не понял?
По коду:
По вопросу: веб-сервер перезапускали после изменения настроек?
Код:
Код который исполняет бесконечный цикл:
Если изменить в конфигурационном файле max_execution_time на 1, то это приведет к ошибке.
Перед циклом нужно определить пустой массив $evenArray.
Переменная $n по сути лишняя - можно добавлять элементы в массив без указания индексов.
Вот так?
Переменная n не проинициализирована. В самый первый раз, где она используется в качестве ключа массива будет ошибка! Ведь такой переменной ещё нет. И не нужна она вам. Добавляйте элементы в массив без использования ключа.
Отлично
Отлично!
Отлично!
Если вы поменяете начальное число на 344, то оно пропустится. Сначала нужно выполнять проверку, а потом уже инкрементить число.
С помощью цикла while создайте массив, содержащий чётные числа от 345 до 357. Затем выведите элементы массива с помощью цикла foreach.
Если начальная граница сместится и будет четным числом, например:
то это число в выборку не попадет. Счётчики инкрементятся в конце итерации, как правило, а не в начале.
Поправил
Отлично!
В первом задании цикл foreach бессмысленный. Там в массиве всегда один элемент. Ознакомьтесь с другими решениями. Не нужно было делать цикл в цикле.
Такой вопрос, почему когда мы пишем такой код
то значение переменной вставляется в индекс массива, а не заменяет его на само значение переменной? Или я что-то не правильно понял?
Ничего в индекс массива не вставляется. Эта запись добавляет элемент в массив. А в вашем коде каждый раз создаётся новый массив с одним элементом.
В именах функций не должно быть никаких подчеркиваний.
$even[] = "$min"; - зачем здесь число в строку превращаете?
Число 357 не проверяется.
Спасибо, поправил.
Теперь ок
Отлично
max_execution_time задает максимальное время в секундах (int), в течение которого скрипт должен полностью загрузиться. Если этого не происходит, работа скрипта завершается. Помогает исключить зависания при корявом коде. По умолчанию - 30 секунд. Если PHP запущен из командной строки, это значение по умолчанию равно 0.
Лучше в конце итерации делать инкремент, в одном месте. В остальном все хорошо.
Вот на задаче с перебором массива я убедился окончательно, что программирование не всем дано) Солидарен с [email protected]. Тоже не осилил. А из ответов в комментариях понял, что сложного ничего не было. Артём, какие толковые ресурсы для практики Вы бы могли порекомендовать ещё? Просто ясно, что если это не пойму, дальше не смогу двигаться нормально.
https://www.hackerrank.com/ можно тут простые задачи поискать. Но вряд ли будет что-то проще, чем этот урок
Спасибо! Буду делать)
++$startNumber - когда нет разницы, что первее сделать, увеличить и вернуть, или вернуть а потом увеличить, стоит использовать постинкремент
Сделяль(насколько можно считать это самостоятельным решением после стольких фейлов))
Последнее число не проверяется. Если потом вдруг верхняя граница изменится на 358, то оно не попадет в массив четных чисел. А должно.
бесконечно выводило 1
изменил запустил и особой разницы не заметил
Отлично. Значит нужно ещё меньше таймаут поставить.
//2ое задание: Цикл будет бесконечным ( в данном случае скрипт проработает 30 секунд, после чего автоматически прекратит работать). Если поставить значение max_execution_time = 1, то скрипт прекратит работу через 1 секунду.
Супер!
Поправьте отступы, почему всё пляшет? В PhpStorm можно нажать Ctrl+Alt+L и оно само исправится.
Не вижу второго цикла foreach. Перечитайте ДЗ.
Число 357 тоже должно проверяться. Верхняя граница может измениться, а код должен продолжить работать. Изменим, например, на 358, а оно не будет проверяться. Исправьте это.
Отлично
echo - не функция. Не нужно правую часть помещать в скобки.
Почему здесь одна строка пустая?
К бесконечному циклу и выводу единиц.
Эта директива устанавливает максимальное время загрузки скрипта. В случае превышения лимита, парсер завершает работу данного скрипта.
После изменения конфигурации вылез фатал еррор: Maximum execution time of 1 second exceeded in C:\OpenServer\domains\myproject.loc\arrays.php on line 3
Числа 345 и 357 не проверяются, а должны.
исправил
Теперь ок
Первое задание интересно и легко)
Второе задание в принципе ожидаемо)
когда js учил по случайности делал похожие бесконечные циклы.
А вот max_execution_time чета не получиось сделать
Число 357 тоже должно проверяться.
Отлично
Крайне неоптимальное решение, но рабочее.
Отлично!
Привело к бесконечному циклу и зависанию сервера.
Директива max_execution_time решает проблему плохо написанного скрипта, как в нашем случае =) и задает значение 1 секунды, за это время скрипт должен полностью загрузиться.
Запустил код заново, вышла ошибка fatal error, которая говорит, что максимальное время выполнения превышено.
Отлично
Код по 1-му пункту задания:
Это бесконечный цикл:
К чему привело? Комп тупит 60 сек, а потом выполнение прерывается.
php.ini редактируется в ЛКМ на флажок в трее -> Дополнительно -> Конфигурация -> PHP
Находишь строку с max_execution_time и там сколько поставишь, столько и будет тупить комп.
Подозреваю, что дробное число секунд нельзя ставить, или я не прав?
Это что за ерунда? Для чего это?
Подозревать ничего не надо) Есть документация
Невнимательно прочел задание.
Так лучше?
Отлично.
Вот здесь только пробел перед квадратными скобками не нужен:
Долго мучился, но вроде так:
Отлично
1:
2 Вариант:
2:
На 3 и 4 отвечу отдельно...
Для чего это?
Внутри while нужно было только заполнить массив.
Нужно такое разделять переносами строк. Не нужно лепить всё в одну.
Тег pre нигде не закрывается. Более того, его использование в подобном примере вообще не уместно.
max_execution_time = (int)(default = 30) | Настройка в php.ini
Эта настройка позволяет менять значение нагрузки скрипта по умолчанию (30 с), тем самым помогает работать со скоростью работы скрипта.
Отлично
Код
Бесконечные число 1 вывело.
Отлично
Скобки и отступы пляшут, перед отправкой сюда в шторме нажимайте ctrl+alt+L, а еще лучше привыкайте сразу писать правильно.
По алгоритму - всё ок.
Закрывающий тег ?> в конце не нужен!
Ок, хоть и слегка запутанно. Лучше инкремент из условия цикла вынести в конец его тела
Результат:
346
348
350
352
354
356
При запуске кода:
произойдёт зацикливание, т.е. скрипт не сможет выйти из цикла.
Директива max_execution_time задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться, при выставлении 1 секунда выдаст сообщение:
"Fatal error: Maximum execution time of 1 second exceeded in C:\OSPanel\domains\myproject.loc\www\index.php on line 4", что говорит о том что скрипт в течении 1 секунды полностью не загрузился и "завис" на четвёртой строчке кода.
На сколько секунд лучше выставлять эту директиву?
Отлично. Значение директивы сильно зависит от проекта. Если мы точно знаем, что сайт отвечает не дольше секунды, значит и значение нужно выставить соотвествующее.
Большое спасибо!
Даже запускать не стану - браузер зависнет, продолжая при этом бесконечно печатать единицы :)
Что с отступами? Оформляйте как следует
Виноват. Успел привыкнуть к IDE, которая выставляет отступы автоматически. Этот же код писал напрямую в комментарий
Почему $i++ в самом начале? Если входное число изменится на 344, то оно пропустится.
Отлично
Супер!
Где скобки??!
Вот домашка. Есть такое предложение - можно ли записать вторую задачу со степенями числа 2 таким образом и лучше это или хуже предложенного решения?
Записать можно. Решение в целом даже лучше, так как рекурсия это всегда оверхед, по сравнению с циклами
Добрый вечер!
Отлично
max_execution_time -Увеличить время выполнения скрипта(по умолчанию 30 секунд)
Выставил =1 секунда.
Отлично
приводит к бесконечному выводу единицы, после смены директивы у меня ничего не поменялось, что я мог сделать не так?
Всё ок, просто за секунду выдается слишком много единиц, браузер начинает тупить.
Запустил код, это привело к бесконечному зацикливанию кода и выводу единиц.
Директива max_execution_time задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, парсер завершает работу скрипта. Этот механизм помогает предотвратить зависание сервера из-за плохо написанного скрипта.
Файл изменил. Код запустил, через несколько секунд выдало ошибку и код прекратился выполняться.
Таким образом мы ограничиваем время для выполнения скрипта, чтобы в случае зацикливания или зависания не было бесконечной загрузки.
А что за парсер?
А вот так написано в официальной документации, которая непойми какая. Думаю это слово можно заменить на сервер? Или лучше так: "Если этого не происходит то скрипт завершает свою работу".
Правильнее будет сказать интерпретатор
Да, согласен
Отлично!
Выполнение
while (true) {
echo 1;
}
привело к множественному числу 1.
После Гугления max_execution_time стало очевидно, что эта директива отвечает за время исполнения скрипта. По идее, изменение ее значения на 1 должно привести к прерыванию скрипта через 1 секунду. Но мне не свезло. По твоему совету к одному из предыдущих комментариев к этому уроку, загуглил функцию sleep. Выставив ее значение на 1, цикл выполнялся 1 секунду. Успев нарисовать две единицы, он перестал выполнятся c появившейся строкой " Fatal error: Maximum execution time of 1 second exceeded "
Вам свезло, у вас очень быстрый комп, который нагенерил слишком много единиц. Так, что браузер просто с ума сошел.
Ну хоть где то фартануло))
:D
1.
Отлично
Отлично
Пробел не нужен
Лишний перенос
Придерживайтесь оформления как в уроках, будьте аккуратнее
После запуска кода сервер вывел бесконечное число единиц. Директива max_execution_time нужна для изменения времени выполнения скрипта, само слово _execution_говорит об этом. Но после установки на 1 секунду сервер просто затупил. Я читал ,что в принципе так делать нельзя. Бесконечная работа скрипта приводит к зависанию сервера.
Ок. Ну на самом деле затупил ваш браузер, а не сервер)
Ок. Очередная запарка. Не сервер а браузер.
Отлично!
Мой пример
Почему всё пляшет? Оформление делайте как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
357 не проверяется, а должно.
Исправил. Прошу прощение за оформление. Исправлюсь.
Отлично
А насчет другого задания, то без изменения значения единицы выводятся бесконечно. Если же изменить значение max_execution_time на 1, то через несколько секунд выдается Fatal error. Нужна эта директива для ограничения времени выполнения скрипта. Но у меня есть немного глупый вопрос. Все-таки в первом случае единицы загружаться прям бесконечно не будут, выполнение кода через некоторое время будет остановлено, но при этом ошибка не выводится (по крайней мере у меня так со значением 60 и 30). Почему так? Мне идти читать документацию?
Отлично. Ошибка выводится, ее браузер просто не может вывести из-за очень большого объёма результата
Отлично
Строки пишутся в одинарных кавычках
Если ввести этот код:
программа будет бесконечно выводить единицу, пока не выдаст ошибку (хотя у меня не вывела, а просто прекратила загружать по прошествии времени).
Если поменять значение на единицу, то ошибка должна выдаваться сразу через секунду. Но у меня продолжает грузить бесконечное число единиц, несмотря на перезагрузку сервера. Судя по комментариям, не у одной меня такая проблема, но она так и осталась без ответа =D
Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.
Хорошо, учту на будущее) Но к слову, в уроке "Условия в PHP" в разделе про тернарный оператор написано, что он представляет собой сокращенную форму конструкции if-else, что тоже получается не совсем корректно =)
И насчет max_execution_time, это проблема моего браузера получается или какая-то другая причина?
Дело в том, что скрипт завершается через секунду, но за эту секунду он умудряется нагенерить очень много единиц. Настолько много, что вкладка браузера просто зависает.
Отлично
1)
2)бесконечный цикл
3)максимальное время в секундах, за которое скрипт должен полностью загрузиться
1-ое задание неверно сделано, перечитайте. По-хорошему внутри цикла должна быть проверка. И делайте код сразу таким, чтобы он оставался рабочим, даже если входные числа 345 и 347 заменятся другими.
Массив с помощью цикла while:
Отлично
Артем, скажите, в ОпенСервере можно поставить версию PHP 7.3, а мы учимся на 7.0. Есть ли разница или можно повысить версию?
Да, конечно. Ставьте самую последнюю.
Отлично
Закрывающий тег ?> в конце файла не нужен.
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Первая часть задания
ставила 1 сек в max_execution_time, перезапускала сервер, ничего не меняется - всё тот же бесконечный ряд единиц.
Это норм, просто очень быстрый процессор, который за секунду успевает нагенерировать столько единиц, что браузер зависает.
Отлично. Только используйте инкремент.
Супер!
Отлично
1)
Отлично
2)
Это привело к зацикливанию. Программа заполняет экран единицами. Причина в том, что нет условия, когда программа выходила бы из цикла.
3) Директива max execution time определяет максимальное время, выделяемое на загрузку PHP-скрипта. Мы уменьшили время с 60 секунд на 1 секунду, чтобы снизить время на обработку кода в случае, если он плохо написан.
даже если он хорошо написан, это не даст ему выполняться дольше 1 секунды)
А с задачей где надо вывести единицу, то из-за того, что условие всегда true, тобишь истинно, то и выводить мы будем постоянно единицу.
Всё ок, только инкрементить лучше в конце цикла, и условие заменить на <= на случай если вместо 357 захотим написать 356.
Отлично
Добрый день!
Результат.
Добавил var_dump($a), чтобы показать, что такой скрипт работает быстрее… Сразу определяется с какого числа из заданного диапазона начинаются четные числа и далее этот диапазон заполняется четными числами ($a += 2;)
346
348
350
352
354
356
111111111111111111111111111111111111111111111111111111111111111111111
Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.
Задание о max_execution_time улыбнуло :)
Там тебе и уроки освоения гугла, и опыт зависания системы
и главное - руки больше бездумно совать никуда не охота :)
=)
Всё отлично, но проблема с форматированием. Сделайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Спасибо, учту.
Ещё заметил что после фигурной скобки стоит ненужная точка с запятой
Да, точно. Спасибо!
Второе задание
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Fatal error: Maximum execution time of 1 second exceeded in C:\OPENSERVER\OpenServer\domains\study\arrays.php on line 80
Ага, всё так и должно быть
Спасибо!
Код
Результат:
int(346)
int(348)
int(350)
int(352)
int(354)
int(356)
Всё отлично, но проблема с форматированием. Сделайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Отлично!
Д/з числа от 345
357 не проверяется, хотя стоило бы.
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Массив, содержащий чётные числа от 345 до 357 и вывод их с помощью цикла foreach
Выше уже ответил. Исправьте форматирование
Отлично
Директива max_execution_time задаёт максимальное время в секундах, в течение которого скрипт должен полностью загрузиться, в противном случае работа скрипта принудительно завершается.
У меня изменения в файле php.ini никак не влияют на выполнение
Отлично.
Просто за секунду успевает сгенерироваться столько единичек, что браузер не вывозит
С помощью цикла while создайте массив, содержащий чётные числа от 345 до 357. Затем выведите элементы массива с помощью цикла foreach.
Вот, сделал
Этот код приводит в к бесконечному циклу
А директива max_execution_time завершит работу скрипта, т.к. он не выполнится за заданное время (1 сек)
Отлично
скрипт выдал ошибку,Fatal error: Maximum execution time of 1 second exceeded
Отлично
Отлично
Первое задание:
По остальному: если запустить код с предложенным циклом, то цикл будет бесконечно повторяться. Директива max_execution_time задает время, за которое скрипт должен полностью загрузится, если этого не произойдет, то работа скрипта будет завершена)