Ускоряем работу скриптов ч.2 (хаки на PHP)
Создано Евгений Злобин в мая 18, 2008Итак, продолжим. Напомню, что с первой частью этой «саги» можно ознакомиться здесь «Ускоряем работу скриптов ч.1«.
5) Работаем с циклами
Далеко ходить не будем, и возьмем уже знакомый по второму пункту пример:
$sum = 0;
for ($i = 1; $i < 3; $i++) $sum += $i;
Теперь давайте постараемся сделать его ещё более компактным. Вот взгляните, как элегантно мы избавляемся от лишнего действия, объединяя сразу два:
for ($i = 1, $sum = 0; $i < 3; $sum += $i++) {};
Таким образом мы заносим всё в цикл. И то, что некоторые пишут используя две-три, а порой пять строчек кода (если учесть фигурные скобки), нам удалось реализовать в одной строке. Компактность, как говориться, налицо.
Далее, предположим, нам не известно количество элементов в цикле. Как поступит большинство кодеров?
for ($i = 1; $i < sizeof($array); $i++) {};
получается, пересчет количества элементов цикла будет происходить с каждой итерацией. Оно вам надо? Нет. Тогда поступим следующим образом:
for ($i = 1, $counter = sizeof($array); $i < $counter; $i++) {};
Иногда разработчик сталкивается с задачей, в которой необходимо реализовать бесконечный цикл. Выдумывать ничего не надо, всё элементарно:
while (true) {исполняемый код}
for (;;) {исполняемый код}
Если же понадобиться выйти из цикла, то используется break, причем можно применять с аргументом. Например break 2, что означает выход сразу из двух циклов;
Пример:
for (;;)
for ($a = 0;;$a++) if ($a == 7) break 2;
Если переменная $a получит значение семь, выходим сразу из двух циклов.
Теперь разберемся как работать с ассоциативными массивами. Для начала заведем себе такой массивчик:
$arr = array('one' => 1, 'two' => 'dva', 3 => 'three');
Пробежаться по этому массиву с помощью цикла
for ($i = 0, $counter = count($arr); $i < $counter; $i++)
уже не получиться.
Придется использование foreach, однако, foreach значительно медленнее, чем for.
foreach ($массив as $ключ => $значение)
действие;
Предположим, необходимо вывести отдельно ключи и их значения
foreach ($arr as $key => $value)
echo 'ключ: '. $key. ' значение: '. $value;
Если же нам необходимо получить только значения, то действуем так:
foreach ($arr as $value) echo ‘значение: ‘. $value;
6) Обмен значениями двух переменных
На первый взгляд тривиальная задача. И большинство решают её путем заведения третьй переменной:
$var_1 = 2;
$var_2 = 3;
$var_3 = $var_2;
$var_2 = $var_1;
$var_1 = $var_3;
Можно выполнить эту же операцию, не прибегая к третьей переменной.
а) Применяем чистую арифметику
$var_1 = $var_1 + $var_2;
$var_2 = $var_1 - $var_2;
$var_1 = $var_1 - $var_2;
б) применям XOR
Для начала разберемся на примерах как работает логическая операция XOR:
1) A xor A = 0;
2) A xor B = B xor A;
3) A xor (A xor B) = B;
$var_1 = $var_1 ^ $var_2;
$var_2 = $var_2 ^ $var_1;
$var_1 = $var_1 ^ $var_2;
Теперь давайте ещё больше запакуем наш код:
$var_1 ^= $var_2 ^= $var_1 ^= $var_2;
7) Тернарность (тернарные операторы)
Эта одна из наиболее удобных, но, в то же время, наименее применяемых начинающими конструкций. Выглядит она так:
условие ? действие_1 : действие_2;
Интерпретируется следующим образом: если условие верно, то выполняется действие_1, иначе выполняется действие_2. Для наглядности посмотрим как в большинстве программ выглядит эта же конструкция:
If (условие) действие_1;
else действие_2;
Пример:
isset($_POST['go']) ? $var = 1 : $var = 0;
Поясню. Если существует переменная $go, полученная методом POST, то переменной $var присваиваем значение один, иначе присваиваем значение 0;
Можно использовать и в таком виде:
$sum = $param_1 > $param_2 ? $var_1 : $var_2;
Если переменная $param_1 больше, чем $param_2, то в переменную $sum заносим значение $var_1, иначе заносим значение переменной $var_2;
Если нам нужно лишь проверить условие и выполнить действие только в случае, если оно верно, то можно действовать так:
$param ? $var = 1024 : 0;
если $param равен true, то в переменную $var заносим число 1024, иначе ничего не выполняем.
Замечу, что двоеточие опускать нельзя, в отличие от оператора else.
p.s. и это ещё не всё, ждите продолжения. А пока снова расслабимся, воскресенье сегодня =)
Самая продаваемая продукция с логотипом «ДОМ-2″ – это мишени.
Может быть Вам это интересно?
- Ускоряем работу скриптов ч.3
- Утилита BCP для экспорта\импорта в MSSQL
- Ускоряем работу скриптов ч.1
- Установка APE на CentOS
- YouTube API & JavaScript Upload
© "Паутина фриланса".


Опять таки покритикую
Я бы избегал бесконечных циклов, нужно постараться чтобы условие было указано в самом операторе for, так нагляднее, конечно, в случае нескольких вложенных циклов деваться некуда. Кстати в примере не оступа, не кавычек, вложенность цикла не особо и бросается в глаза, я как то из-за лишнего отступа в одном из своих скриптов, потом при доработке неправильно кавычки расставил, пришлось поразмышлять откуда появились ошибки. С тех пор понял почему кавычки нужно ставить всегда. В этом отношении мне питон нравиться, там отступы всегда правильно, приходится ставить.
Смотрю на $var_1 ^= $var_2 ^= $var_1 ^= $var_2; и понимаю насколько я хреновый программер, для меня не очевидно, что тут обмен переменных хочется в одну строчку имхо лучше так list($b, $a) = array($a, $b), скорость выполнения такой операция я не тестил, но в большинстве случаев ее очевидность важнее скорости.
Интересный ты пример привел по поводу использования функции list() для обмена. Если честно, мне даже в голову это не приходило. Хотя этот метод я обычно использую, если нужно задать значения сразу нескольким переменным, получается компактно и наглядно.
Тоже использую функцию list(). Для меня так нагляднее. хотя не считаю себя программистом, так учусь, на своих и чужих ошибках.
Интересные способы ускорения. Я сейчас работаю с CMS MODx, приходится много на пыхпыхе писать, конечно же слежу за оптимизацией скорости. А так получается – с новыми идеями реализовать быстрые скрипты.
Главное знать конструкцию и синтаксис языка, тогда и не будете писать «свой велосипед» когда он уже был создан разработчиками пхпешки.
Спасибо! Как раз очень пригодилось, так как только начал осваивать ПХП.
вопрос конечно спорный, но попробовать стоит