Выбрать главу

<?php

$langs =

array("Lisp","Python","Java","PHP",

"Perl","Lisp");

$lisp_keys = array_keys($langs,"Lisp");

echo "Lisp входит в массив ".

count($lisp_keys) ." раза:<br>";

foreach ($lisp_keys as $val){

echo "под номером $val <br>";

}

?>

В результате получим:

Lisp входит в массив 2 раза:

под номером 0

под номером 5

Функция array_keys(), как и две предыдущие, зависит от регистра, т.е. элементов LISP в массиве она не обнаружит. array_keys() появилась только в PHP4. В PHP3 для реализации ее функциональности нужно придумывать свою функцию.

Если есть функция для получения всех ключей массива, то можно предположить, что существует и функция для получения всех значений массива. Действительно, она существует. Это функция array_values(массив). Все значения переданного ей массива записываются в новый массив, проиндексированный целыми числами, т.е. все ключи массива теряются, остаются только значения. Но вернемся к нашему примеру.

Итак, мы выяснили, что язык Lisp случайно упомянут в нашем массиве дважды. Поскольку изучить один язык дважды нельзя («учил, но забыл» не считается), то нужно как-то избавиться от повторяющихся языков. Сделать это довольно просто с помощью функции array_unique().

Функция array_unique

Функция array_unique(массив) удаляет повторяющиеся значения из массива и возвращает новый массив. Таким образом, вместо нескольких одинаковых значений и их ключей мы имеем одно значение. Какой у него будет ключ? Как из нескольких ключей одинаковых элементов выбирается тот, который будет сохранен в новом массиве? Происходит следующее. Все элементы массива преобразуются в строки и сортируются. Затем обработчик запоминает первый ключ для каждого значения, а остальные ключи игнорирует.

Попробуем избавиться от повторяющихся языков в списке изученных.

<?php

$langs =

array("Lisp","Java","Python","Java",

"PHP","Perl","Lisp");

print_r(array_unique($langs));

?>

Получим следующее:

Array ( [0] => Lisp [1] => Java [2]

=> Python [4] => PHP [5] => Perl )

Далее рассмотрим задачу сортировки массива.

Сортировка массивов

Необходимость сортировки данных, в том числе и данных, хранящихся в виде массивов, очень часто возникает при решении самых разнообразных задач. Если в языке Си для того, чтобы решить эту задачу, нужно написать десятки строк кода, то в PHP это делается одной простой командой.

Функция sort

Функция sort имеет следующий синтаксис

sort (массив [, флаги])

и сортирует массив, т.е. упорядочивает его значения по возрастанию. Эта функция удаляет все существовавшие в массиве ключи, заменяя их числовыми индексами, соответствующими новому порядку элементов. В случае успешного завершения работы она возвращает true, иначе – false.

Пример 7.6. Пусть у нас есть два массива: цены товаров – их названия и, наоборот, названия товаров – их цены. Упорядочим эти массивы по возрастанию:

$items = array(10 => "хлеб", 20 => "молоко",

30 => "бутерброд");

sort($items);

// строки сортируются в алфавитном

// порядке, ключи теряются

print_r($items);

$rev_items = array("хлеб" => 10,

"бутерброд" => 30, "молоко" => 20);

sort($rev_items);

// числа сортируются по возрастанию,

// ключи теряются

print_r($rev_items);

?>

Получим:

Array ( [0] => бутерброд [1] =>

молоко [2] => хлеб )

Array ( [0] => 10 [1] => 20 [2] => 30 )

В качестве дополнительного аргумента флаги может использоваться одна из следующих констант:

- SORT_REGULAR – сравнивать элементы массива обычным образом;

- SORT_NUMERIC – сравнивать элементы массива как числа;

- SORT_STRING – сравнивать элементы массива как строки.

Функции asort, rsort, arsort

Если требуется сохранять индексы элементов массива после сортировки, то нужно использовать функцию asort (массив [, флаги]). Если необходимо отсортировать массив в обратном порядке, т.е. от наибольшего значения к наименьшему, то можно задействовать функцию rsort (массив [, флаги]). А если при этом нужно еще и сохранить значения ключей, то следует использовать функцию arsort(массив [, флаги]). Как вы, наверное, заметили синтаксис у этих функций абсолютно такой же, как у функции sort. Соответственно и значения флагов могут быть такими же, как у sort: SORT_REGULAR, SORT_NUMERIC, SORT_STRING. Кстати говоря, флаг SORT_NUMERIC появился только в PHP4.

<?php

$books = array("Пушкин"=>"Руслан и Людмила",

"Толстой"=>"Война и мир",

"Лермонтов"=>"Герой нашего времени");

asort($books);

// сортируем массив,

// сохраняя значения ключей

print_r($books);

echo "<br>";

rsort($books);

// сортируем массив в обратном порядке,

// ключи будут заменены

print_r($books);

?>

В результате работы этого скрипта получим:

Array ( [Толстой] => Война и мир

[Лермонтов] => Герой нашего времени

[Пушкин] => Руслан и Людмила )

Array ( [0] => Руслан и Людмила

[1] => Герой нашего времени

[2] => Война и мир )

Пример 7.8. Допустим, мы создаем каталог описаний документов. У каждого документа есть автор, название, дата публикации и краткое содержание. Мы уже не раз отображали описания, составленные из этих характеристик. Каждый раз порядок отображения этих элементов зависел от созданной нами программы. Теперь же мы хотим иметь возможность изменять порядок отображения элементов по желанию пользователя. Составим для этого следующую форму:

<form action=task.php>

<table border=1>

<tr><td>Название </td><td><input type=text

name=title size=5> </td></tr>

<tr><td>Краткое содержание </td><td><input

type=text name=description size=5>

</td></tr>

<tr><td>Автор </td><td><input type=text

name=author size=5> </td></tr>