- while vs foreach vs for что быстрее в php
- Результаты тестирования скорости массивов в PHP
- В порядке возрастания
- Выводы
- PHP Loops (while, do while, foreach & for) Tutorial
- Использование циклов в PHP
- Foreach – перебор массива
- Результат:
- Альтернативный синтаксис foreach
- For – цикл с счетчиком
- Результат:
- Альтернативный синтаксис
- Результат:
- Альтернативный синтаксис for
- While – цикл с предусловием
- Результат:
- Альтернативный синтаксис while
- Do-while – цикл с постусловием
- Результат:
- Управление циклами
- Break
- Continue
- Результат:
- PHP — Операторы циклов
- Оператор цикла for
- Синтаксис
- Оператор цикла while
- Синтаксис
- Оператор do … while
- Синтаксис
- Оператор цикла foreach
- Синтаксис
- Оператор break
- Оператор continue
while vs foreach vs for что быстрее в php
Один из самых важных и «узких» моментов, скорость работы массива. По массиву меню в процессе построения функции могут пробегать по многу раз, соответственно крайне важно чтоб этот момент работал на максимуме возможностей. давайте разберёмся всю ли правду пишут нам в интернете, какой массив работает быстрее while vs foreach vs for. Часть тестов не несут осмысленной нагрузки — ради интереса добавлены. Каждый тест перезапускался несколько раз.
Необходимо понимать, что тест имеет перекос в сторону обращения к двумерному массиву.
$a=array( 0=>array(0=>'top') ,1=>array(0=>'top') ,2=>array(0=>'top') ,3=>array(0=>'top') ,4=>array(0=>'top') ,5=>array(0=>'left') ,6=>array(0=>'left') ,7=>array(0=>'left') ,8=>array(0=>'left') ,9=>array(0=>'left') ); в функциях function f1() > 2. foreach($a as $k => $v) < if($v[0]=='right')<>> 3. for($i=0; $i > 4. $c=count($a); for($i=0; $i > 5. $c=count($a)-1; for($i=$c; $i>0; --$i) < if($a[$i][0]=='right')<>> 6. reset($a); while(list($k, $v) = each($a)) < if($v[0]=='right')<>> 7. reset($a); while(list(, $v) = each($a)) < if($v[0]=='right')<>> 8. $i=0; while($i++$i; > 9. $i=0; $c=count($a); while($i <$c)< if($a[$i][0]=='right')<>++$i; > 10. $i=count($a)-1; while($i>-1) < if($a[$i][0]=='right')<>--$i; > 11. $i=count($a)-1; while($i>=0) < if($a[$i][0]=='right')<>--$i; >
Результаты тестирования скорости массивов в PHP
Компьютер:
№ | вызовов / функция | вpемя | быстрее на | |
---|---|---|---|---|
1 | 1 / foreach($a as $v) | 0.000018 | +0.000006 с. | +33.33 % |
2 | 1 / foreach($a as $k => $v) | 0.000012 | 0.000000 с. | 0 % |
3 | 1 / for($i=0; $i | 0.000036 | +0.000024 с. | +66.67 % |
4 | 1 / $c=count($a); for($i=0; $i | 0.000014 | +0.000002 с. | +14.29 % |
5 | 1 / $c=count($a)-1; for($i=$c; $i>0; —$i) | 0.000022 | +0.000010 с. | +45.45 % |
6 | 1 / reset($a); while(list($k, $v) = each($a)) | 0.000029 | +0.000017 с. | +58.62 % |
7 | 1 / reset($a); while(list(, $v) = each($a)) | 0.000035 | +0.000023 с. | +65.71 % |
8 | 1 / $i=0; while($i0.000028 | +0.000016 с. | +57.14 % | |
9 | 1 / $i=0; $c=count($a); while($i<$c) | 0.000021 | +0.000009 с. | +42.86 % |
10 | 1 / $i=count($a)-1; while($i>-1) | 0.000013 | +0.000001 с. | +7.69 % |
11 | 1 / $i=count($a)-1; while($i>=0) | 0.000021 | +0.000009 с. | +42.86 % |
Сервер:
№ | вызовов / функция | вpемя | быстрее на | |
---|---|---|---|---|
1 | 1 / foreach($a as $v) | 0.000014 | +0.000005 с. | +35.71 % |
2 | 1 / foreach($a as $k => $v) | 0.000009 | 0.000000 с. | 0 % |
3 | 1 / for($i=0; $i | 0.000035 | +0.000026 с. | +74.29 % |
4 | 1 / $c=count($a); for($i=0; $i | 0.000012 | +0.000003 с. | +25 % |
5 | 1 / $c=count($a)-1; for($i=$c; $i>0; —$i) | 0.000020 | +0.000011 с. | +55 % |
6 | 1 / reset($a); while(list($k, $v) = each($a)) | 0.000023 | +0.000014 с. | +60.87 % |
7 | 1 / reset($a); while(list(, $v) = each($a)) | 0.000036 | +0.000027 с. | +75 % |
8 | 1 / $i=0; while($i0.000026 | +0.000017 с. | +65.38 % | |
9 | 1 / $i=0; $c=count($a); while($i<$c) | 0.000021 | +0.000012 с. | +57.14 % |
10 | 1 / $i=count($a)-1; while($i>-1) | 0.000012 | +0.000003 с. | +25 % |
11 | 1 / $i=count($a)-1; while($i>=0) | 0.000023 | +0.000014 с. | +60.87 % |
В порядке возрастания
Компьютер:
№ | вызовов / функция | вpемя | быстрее на | |
---|---|---|---|---|
2 | 1 / foreach($a as $k => $v) | 0.000012 | 0.000000 с. | 0 % |
10 | 1 / $i=count($a)-1; while($i>-1) | 0.000013 | +0.000001 с. | +7.69 % |
4 | 1 / $c=count($a); for($i=0; $i | 0.000014 | +0.000002 с. | +14.29 % |
1 | 1 / foreach($a as $v) | 0.000018 | +0.000006 с. | +33.33 % |
9 | 1 / $i=0; $c=count($a); while($i<$c) | 0.000021 | +0.000009 с. | +42.86 % |
11 | 1 / $i=count($a)-1; while($i>=0) | 0.000021 | +0.000009 с. | +42.86 % |
5 | 1 / $c=count($a)-1; for($i=$c; $i>0; —$i) | 0.000022 | +0.000010 с. | +45.45 % |
8 | 1 / $i=0; while($i0.000028 | +0.000016 с. | +57.14 % | |
6 | 1 / reset($a); while(list($k, $v) = each($a)) | 0.000029 | +0.000017 с. | +58.62 % |
7 | 1 / reset($a); while(list(, $v) = each($a)) | 0.000035 | +0.000023 с. | +65.71 % |
3 | 1 / for($i=0; $i | 0.000036 | +0.000024 с. | +66.67 % |
Сервер:
№ | вызовов / функция | вpемя | быстрее на | |
---|---|---|---|---|
2 | 1 / foreach($a as $k => $v) | 0.000009 | 0.000000 с. | 0 % |
10 | 1 / $i=count($a)-1; while($i>-1) | 0.000012 | +0.000003 с. | +25 % |
4 | 1 / $c=count($a); for($i=0; $i | 0.000012 | +0.000003 с. | +25 % |
1 | 1 / foreach($a as $v) | 0.000014 | +0.000005 с. | +35.71 % |
5 | 1 / $c=count($a)-1; for($i=$c; $i>0; —$i) | 0.000020 | +0.000011 с. | +55 % |
9 | 1 / $i=0; $c=count($a); while($i<$c) | 0.000021 | +0.000012 с. | +57.14 % |
6 | 1 / reset($a); while(list($k, $v) = each($a)) | 0.000023 | +0.000014 с. | +60.87 % |
11 | 1 / $i=count($a)-1; while($i>=0) | 0.000023 | +0.000014 с. | +60.87 % |
8 | 1 / $i=0; while($i0.000026 | +0.000017 с. | +65.38 % | |
3 | 1 / for($i=0; $i | 0.000035 | +0.000026 с. | +74.29 % |
7 | 1 / reset($a); while(list(, $v) = each($a)) | 0.000036 | +0.000027 с. | +75 % |
Выводы
- Неожиданно foreach показал хороший результат..
- Не все циклы в обратном порядке работают быстрей.
- Count внутри цикла работает медленнее, везде об этом пишут — вычисляется на каждом шагу значение.
- Любые конструкции где php приходится самому додумывать, обрабатывать пропуски — медленнее, так и здесь while(list(, $v)
- Больше или равно работает медленнее нежели меньше, поэтому >-1 писать выгоднее нежели >=0 итп.
- foreach($a as $k=>$v) быстрее чем foreach($a as $v)
Много где пишут, что foreach медленнее остальных циклов, при этом тесты проводят только через foreach($a as $v). Отдельно в следующий раз протестирую что же быстрей for, while на каком-нить синтетическом тесте без обращения к массиву.
PHP Loops (while, do while, foreach & for) Tutorial
In this tutorial, we learn how to control the flow of our application even further. We learn how PHP can help us iterate through sections of code with while, do-while, for and foreach loop statements.
We also cover so called nested loops, which are loops inside other loops. And finally, we compare each loop and explain when to use which one.
By default, the flow of an application written in PHP is sequential. It starts at the top and flows sequentially to the bottom. Many times we will need to alter this flow and allow specific sections of code to be repeated multiple times.
For this purpose, PHP offers us various types of iteration, or looping, logic which are capable of repeating sections of code. Iteration helps us with repetitive tasks and when dealing with big data.
As an example, let’s consider a database for a mailing list which contains entries for a name and email address.
When we want to send an email to everyone on the list, we will need to iterate through all the users in the database one by one. We then fetch their email address and send them an email.
The interpreter will start at the first user and send an email to that user. If there are more users in the database, it will process the next user in the database and send them an email too.
This process loops over and over for all the users in the database, or until we tell it to stop.
PHP offers us four types of loop statements:
A while loop will tell the interpreter to execute its code block repeatedly, as long as the while expression remains true. The expression will be evaluated each time at the beginning of the loop’s iteration.
The basic form of a while loop is as follows.
Использование циклов в PHP
PHP имеет четыре вида циклов и операторы управления ими, рассмотрим поподробнее.
Foreach – перебор массива
Предназначен для перебора элементов массива.
$array = array( 1 => 'Значение 1', 2 => 'Значение 2', 3 => 'Значение 3', 4 => 'Значение 4', ); // Вывод ключей foreach ($array as $key => $val) < echo $key . '
'; > // Вывод значений foreach ($array as $key => $val) < echo $val . '
'; >
Результат:
1 2 3 4 Значение 1 Значение 2 Значение 3 Значение 4
Альтернативный синтаксис foreach
For – цикл с счетчиком
Цикл работает пока выполняется заданное условие. Обычно применяется в качестве счетчика.
// Счетчик от 0 до 5 for ($n = 0; $n // Счетчик от 5 до 0 for ($n = 5; $n >= 0; $n--)
Результат:
Альтернативный синтаксис
$array = array( 'Значение 1', 'Значение 2', 'Значение 3', 'Значение 4', ); for ($n = 0; $n < count($array); $n++) < echo $array[$n] . '
'; >
Результат:
Значение 1 Значение 2 Значение 3 Значение 4
Альтернативный синтаксис for
While – цикл с предусловием
Т.е. если перед началом итерации условие выполняется, то цикл продолжает свою работу.
Результат:
Альтернативный синтаксис while
Do-while – цикл с постусловием
В отличии от while этот цикл проверяет выполнения условия после каждой итерации. Do-while не имеет альтернативного синтаксиса.
Результат:
Управление циклами
Break
Вызов break или break 1 в цикле останавливает его.
Для вложенных циклов используется break 2 и т.д.
Continue
Используется для пропуска итерации.
Результат:
Для вложенных циклов по аналогии с break 2 , break 3 – continue 2 , continue 3 .
PHP — Операторы циклов
for — перебирает через цикл блок кода определенное количество раз.
while – перебирает через цикл блок кода, если и до тех пор, пока указанное условие является истинным.
do … while — перебирает через цикл блок кода, а затем повторяет цикл, пока выполняется специальное условие.
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
foreach – перебирает через цикл каждый элемент в массиве.
Ниже рассмотрим ключевые слова continue и break, которые используются для выполнения циклов.
Оператор цикла for
Оператор for используется, когда вы знаете, сколько раз вам нужно выполнить оператор или блок операторов.
Синтаксис
Для установки начального значения счетчика используется инициализатор. Для этой цели может быть объявлена переменная, ее традиционно называют $i.
В следующем примере выполняется пять итераций и при каждом выполнении цикла изменяется назначенное значение двух переменных:
Этот код дает следующий результат: At the end of the loop a = 50 and b = 25
Оператор цикла while
Оператор while выполняет блок кода, если и до тех пор, пока условное выражение истинно. Если условное выражение истинно, тогда будет выполняться блок кода. После выполнения кода условное выражение снова будет оценено, и цикл будет продолжаться до тех пор, пока условное выражение не окажется ложным.
Синтаксис
В этом примере значение переменной уменьшается при каждой итерации цикла, и значение счетчика увеличивается до тех пор, пока не достигнет 10, после этого условие перестанет выполняться и цикл завершится.
Этот код дает следующий результат: Loop stopped at i = 10 and num = 40
Оператор do … while
Оператор do … while выполняет блок кода хотя бы один раз — он повторяет цикл, пока условие выполняется.
Синтаксис
В следующем примере значение i увеличивается, по крайней мере, один раз и значение переменной i будет увеличиваться до тех пор, пока не достигнет 10:
Этот код дает следующий результат — Loop stopped at i = 10
Оператор цикла foreach
Оператор foreach используется для преобразования массивов через цикл. При каждой итерации текущему элементу массива присваивается значение $, а указатель массива перемещается на одну позицию, и при следующем проходе будет обрабатываться следующий элемент.
Синтаксис
В следующем примере выводятся значения массива.
Этот код дает следующий результат:
Оператор break
Ключевое слово PHP break используется для преждевременного прекращения выполнения цикла. Оператор break находится внутри блока операторов. Он предоставляет вам полный контроль, вы можете остановить цикл, когда вам нужно. После выхода из цикла будет выполняться следующее после цикла действие.
В следующем примере условие test становится истинным, когда значение счетчика достигает 3 и цикл завершается.
Этот код дает следующий результат: Loop stopped at i = 3
Оператор continue
Ключевое слово PHP continue используется для остановки текущей итерации цикла, но оно не завершает цикл. Как и оператор break, оператор continue находится внутри блока операторов, содержащих код, который выполняется циклом. Если при проходе кода, встречается оператор continue , остальная часть кода цикла пропускается, и начинается следующий проход цикла.
В следующем примере цикл выведет значение массива, но в случае если условие истинно он пропускает код и выводит следующее значение.