Ускоряем работу скриптов ч.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″ – это мишени.


Может быть Вам это интересно?

© "Паутина фриланса".

7 отв. в “Ускоряем работу скриптов ч.2 (хаки на PHP)”

  1. Евгений

    Опять таки покритикую :)

    Я бы избегал бесконечных циклов, нужно постараться чтобы условие было указано в самом операторе for, так нагляднее, конечно, в случае нескольких вложенных циклов деваться некуда. Кстати в примере не оступа, не кавычек, вложенность цикла не особо и бросается в глаза, я как то из-за лишнего отступа в одном из своих скриптов, потом при доработке неправильно кавычки расставил, пришлось поразмышлять откуда появились ошибки. С тех пор понял почему кавычки нужно ставить всегда. В этом отношении мне питон нравиться, там отступы всегда правильно, приходится ставить.

    Смотрю на $var_1 ^= $var_2 ^= $var_1 ^= $var_2; и понимаю насколько я хреновый программер, для меня не очевидно, что тут обмен переменных хочется в одну строчку имхо лучше так list($b, $a) = array($a, $b), скорость выполнения такой операция я не тестил, но в большинстве случаев ее очевидность важнее скорости.

  2. Евгений Злобин

    Интересный ты пример привел по поводу использования функции list() для обмена. Если честно, мне даже в голову это не приходило. Хотя этот метод я обычно использую, если нужно задать значения сразу нескольким переменным, получается компактно и наглядно.

  3. Технолог

    Тоже использую функцию list(). Для меня так нагляднее. хотя не считаю себя программистом, так учусь, на своих и чужих ошибках.

  4. Интересные способы ускорения. Я сейчас работаю с CMS MODx, приходится много на пыхпыхе писать, конечно же слежу за оптимизацией скорости. А так получается – с новыми идеями реализовать быстрые скрипты.

  5. Андрей Смирнов

    Главное знать конструкцию и синтаксис языка, тогда и не будете писать «свой велосипед» когда он уже был создан разработчиками пхпешки.

  6. Спасибо! Как раз очень пригодилось, так как только начал осваивать ПХП.

  7. вопрос конечно спорный, но попробовать стоит

Оставить ответ