Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка PHP 2008.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

Тема 6 Работа с массивами

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

6.2 Функции для работы с массивами

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

Сортировка массива по значениям (asort()/arsort()).

Функция assort() сортирует массив, указанный в ее параметре в алфавитном (если это строки) или в возрастающем (для чисел) порядке. При этом сохраняются связи между ключами и соответствующими им значениями. Пример:

$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha",

"d"=>"Processor");

asort($A);

foreach($A as $k=>$v) echo "$k=>$v ";

// выводит «c=>Alpha d=>Processor b=>Weapon a=>Zero»

Функция arsort() упорядочивает массив по убыванию.

Сортировка по ключам (ksort()/krsort()).

Функция ksort() сортирует массив по ключам (в порядке возрастания). Пример:

$A=array("d"=>"Zero","c"=>"Weapon","b"=>"Alpha","a"=>"Processor");

ksort($A);

for (Reset($A); list ($k, $v) =each ($A);) echo"$k=>$v";

// выводит "a=>Processor b=>Alpha c=>Weapon d=>Zero"

Функция для сортировки по ключам в обратном порядке – krsort().

Сортировка по ключам при помощи функции uksort().

Используется при сортировке по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files хранится список имен файлов и подкаталогов в текущем каталоге. Необходимо вывести этот список не только в лексикографическом порядке, но также и чтобы все каталоги предшествовали файлам. В этом случае можно воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами.

Пример. Сортировка с помощью пользовательской функции

// Эта функция должна сравнивать значения $f1 и $f2 и возвращать:

// -1, если $fl<$f2,

// 0, если $fl==$f2

// 1, если $fl>$f2

function FCmp($f1,$f2)

{

// Каталог всегда предшествует файлу

if (is_dir($fl) && !is_dir($f2)) return -1;

// Файл всегда идет после каталога

if (!is_dir($fl) && is_dir($f2)) return 1;

// Иначе сравниваем лексикографически

if($f1<$f2) return -1; elseif ($fl>$f2) return 1; else return 0;

}

// Пусть $Files содержит массив с ключами — именами файлов

// в текущем каталоге. Отсортируем его.

uksort($Files,"FCmp");

// передаем функцию сортировки "по ссылке"

Cвязи между ключами и значениями функцией uksort() сохраняются.

Сортировка по значениям при помощи функции uasort().

Функция uasort() аналогична uksort(), с той разницей, что пользовательской функции сортировки передаются не ключи, а очередные значения из массива. При этом также сохраняются связи в парах ключ=> значение.

Переворачивание массива array_reverce()

Функция array_reverse() возвращает массив, элементы которого следуют в обратном порядке относительно массива, переданного в параметре. При этом связи между ключами и значениями сохраняются. Например, вместо того, чтобы ранжировать массив в обратном порядке при помощи arsort(), можно отсортировать его в прямом порядке, а затем перевернуть:

$A=array ("a"=>"Zero", "b"=>"Weapon", "c"=>"Alpha",

"d"=>"Processor");

asort ($A);

$A=array_reverse($A);

Сортировка списка sort()/rsort()

Эти две функции предназначены для сортировки списков (под списками понимаются массивы, ключи которых начинаются с 0 и не имеют пропусков). Функция sort() сортирует список по значениям в порядке возрастания, a rsort() – в порядке убывания. Пример:

$A=array ("One", "Two", "Three", "Four");

sort ($A) ;

for($i=0; $i<count($A); $i++) echo "$i:$A[$i] ";

// выводит «0: Four 1: Two 2 : Three 3 :One»

Любой ассоциативный массив воспринимается этими функциями как список. То есть после упорядочивания последовательность ключей превращается в 0,1,2,..., а значения нужным образом перераспределяются. Cвязи между парами ключ=>значение не сохраняются, более того – ключи просто пропадают, поэтому сортировать что-либо, отличное от списка, нецелесообразно.

Сортировка списка при помощи функции usort().

Эта функция является «гибридом» функций uasort() и sort(). От sort() она отличается тем, что критерий сравнения обеспечивается пользовательской функцией. А от uasort() – тем, что она не сохраняет связей между ключами и значениями, а потому пригодна только для сортировки списков. Пример:

function FCmp($a,$b)

{ return strcmp ($a, $b); }

$A=array("One", "Two", "Three", "Four");

usort($A);

for ($i=0; $i<count ($A); $i++) echo "$i:$A[$i]";

// выводит «0:Four 1:One 2:Three 3:Two»

Функция strcmp(), возвращает –1, если $а<$b, 0, если они равны, и 1, если $а>$b. Приведенный здесь пример полностью эквивалентен простому вызову sort().

Перемешивание списка shuffle().

Функция shuffle() «перемешивает» список, переданный ей первым параметром, так, чтобы его значения распределялись случайным образом. При этом, во-первых, изменяется сам массив, а во-вторых, ассоциативные массивы воспринимаются как списки. Пример:

$А=аrrау(10,20,30,40,50);

shuffle($A);

foreach($A as $v) echo "$v ";

Приведенный фрагмент выводит числа 10, 20, 30, 40 и 50 в случайном порядке. Функция shuffle() использует стандартный генератор случайных чисел, который перед работой необходимо инициализировать при помощи вызова srand(), иначе при повторном вызове программы результат не измениться.