САМОУЧИТЕЛЬ PHP 4



         

Пример функции - часть 2


Алгоритм работы функции таков: в цикле анализируем очередной элемент на предмет "максимальности": если он больше текущего максимального элемента, но меньше $max, он сам становится текущим максимумом, а его положение запоминается в $n. (Обратите внимание, что в описании функции параметр $max задается в виде $max="". Ýто означает, что если при вызове он будет опущен, то функция получит пустую строку в $max.)

После окончания цикла в $n окажется номер такого элемента (либо число -1, которое мы присвоили $n в начале). Его-то мы и возвращаем в качестве значения функции оператором return.

Ну вот, теперь в программе ниже описания функции можно написать:

$a=array(10,20,80,35,22,57);

$m=GetMaxNum($a,50);  // теперь $m=3, ò. å. $a[$m]=35

В действительности, поскольку фаза трансляции и исполнения в PHP разделены, мы можем применять вызовы функции еще до того, как она была описана. Однако это работает, конечно же, только в том случае, когда в момент интерпретации вызова функции ее код будет уже оттранслирован (например, вызов и описание функции происходят в одном и том же файле). Тем не менее, не советую вам злоупотреблять данной возможностью — лучше всегда поступать так, как это принято в Паскале: вызывать функции только после того, как они будут определены.

Зачем может понадобиться функция GetMaxNum() в реальной жизни? Например, для сортировки массива в порядке убывания с одновременным получением уникальных элементов. Конечно, это будет очень неоптимальный алгоритм, но для тренировочных целей он нам вполне подойдет (листинг 11.2):

Листинг 11.2. Сортировка с применением GetMaxNum()

function MySort($Arr)

{ $m= GetMaxNum($Arr)+1; // число, на 1 большее максимума в массиве

  while(($n=GetMaxNum($Arr,$m))!=-1)

    $New[]=$m=$Arr[$n];  // добавляем очередной максимальный элемент

  return $New;

}

// Пример вызова:

$Sorted=MySort(array(1,2,5,2,4,7,3,7,8));

// Теперь $Sorted===array(8,7,5,4,3,2,1)

Приведенная функция не изменяет исходный массив, а возвращает новый. В силу устройства функции GetMaxNum()

в результирующий массив будут помещены только уникальные элементы из $Arr, отсортированные в порядке убывания.

Функцию MySort()

можно ускорить примерно в 2 раза, если после каждой итерации удалять из массива $Arr обработанный элемент при помощи Unset(). Впрочем, это не так интересно, как может показаться.




Содержание  Назад  Вперед