Работа с массивами : Сортировка массивов
array_reverse
Расстановка элементов массива в обратном порядке.
Синтаксис :
array array_reverse(array arr);
Функция array_reverse() возвращает массив, элементы которого
следуют в обратном порядке относительно массива, переданного в
параметре. При этом связи между ключами и значениями, конечно, не
теряются. Например, вместо того, чтобы ранжировать массив в обратном
порядке при помощи arsort(), мы можем отсортировать его в
прямом порядке, а затем перевернуть:
$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor");
asort($A);
$A = array_reverse($A);
shuffle
Перемешивание элементов массива.
Синтаксис:
void shuffle(array arr);
Функция shuffle() "перемешивает" список, переданный ей первым
параметром arr, так, чтобы его значения распределялись
случайным образом. При этом измениться сам массив и ассоциативные
массивы воспринимаются как списки.
$A = array(10,20,30,40,50);
shuffle($A);
foreach($A as $v) echo "$v ";
// Выведет 10,20,30,40,50 в случайном порядке
sort
Сортировка массива по возрастанию.
Синтаксис:
void sort(array arr [, int sort_flags])
Эта функция предназначена для сортировки списков (списки - массивы,
ключи которых начинаются с 0 и не имеют пропусков) в порядке
возрастания.
$A = array("One", "Two", "Tree", "Four");
sort($A);
for($i=0; $i<count($A); $i++) echo "$i:$A[$i] ";
// выводит "0:Four 1:Two 2:Tree 3:One"
Любой ассоциативный массив Воспринимается этой функцией как список.
То есть после упорядочивания последовательность ключей превращается
в 0,1,2,..., а значения нужным образом перераспределяются. Как
видим, связи между параметрами ключ=>значение не сохраняются,
более того - ключи просто пропадают, поэтому сортировать что-либо,
отличное от списка, вряд ли целесообразно.
Аргумент sort_flags задает следующие флаги сортировки:
rsort
Сортировка массива по убыванию.
Синтаксис:
void rsort(array arr [, int sort_flags])
Аналогична функции sort(), только сортирует по убыванию.
asort
Сортировка ассоциативного массива по возрастанию.
Синтаксис :
void asort(array arr [, int sort_flags]);
Функция asort() сортирует массив, указанный в ее параметре,
так, чтобы его значения шли в алфавитном (если это строки) или
возрастающем (для чисел) порядке. При этом сохраняются связи между
ключами и соответствующими им значениями, т.е. некоторые пары
ключ=>значение просто "всплывают" наверх, а некоторые -
наоборот, "опускаются".
$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"
// как видим, поменялся только порядок пар ключ=>значение
По умолчанию функция asort() сортирует массив в алфавитном
порядке. Значения флагов сортировки sort_flags приведены в
описании функции sort().
arsort
Сортировка ассоциативного массива по убыванию.
Синтаксис :
void arsort(array arr [, int sort_flags]);
Эта функция аналогична функции asort(), только она
упорядочивает массив не по возрастанию, а по убыванию.
$arr=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
arsort($arr);
reset($arr);
while(list ($key, $val) = each ($arr)) {
echo "$key = $val<BR>l";
}
// выведет:
a = orange
d = lemon
b = banana
c = apple
ksort
Сортировка массива по возрастанию ключей.
Синтаксис :
int ksort(array arr [, int sort_flags]);
Функция практически идентична функции asort(), с тем
различием, что сортировка осуществляется не по значениям, а по
ключам (в порядке возрастания).
$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"
Аргумент sort_flags указывавет параметры сортировки.
krsort
Сортировка массива по убыванию индексов.
Синтаксис :
int krsort(array arr [, int sort_flags]);
Эта функция аналогична функции ksort(), только она
упорядочивает массив по ключам в обратном порядке.
natsort
Выполняет "естественную" сортировку массива.
Синтаксис :
void natsort(array arr);
Функция natsort() сортирует массив в "естественном" для
человека порядке.
$arr1 = array("html_12.html", "html_10.html", "html_2.html", "html_1.html");
$arr2 = $arr1;
sort($arr1);
echo "Стандартная сортировка:\n";
print_r($arr1);
natsort($arr2);
echo "Естественная сортировка:\n"
print_r($arr2);
Этот пример выведет следующее:
Стандартная сортировка:
Array
(
[0] => html_1.html
[1] => html_10.html
[2] => html_12.html
[3] => html_2.html
)
Естественная сортировка:
Array
(
[3] => html_1.html
[2] => html_2.html
[1] => html_10.html
[0] => html_12.html
)
uasort
Пользовательская сортировка ассоциативного массива.
Синтаксис:
void uasort(array arr, function cmp_function)
Функция uasort() сортирует массив arr с сохранением
индексных ассоциаций, используя для сравнения индексов элементов
пользовательскую функцию, указанную аргументом cmp_function.
uksort
Пользовательская сортировка массива по ключам.
Синтаксис:
void uksort(array arr, function cmp_function)
Функция uksort() сортирует массив arr по индексам с
сохранением индексных ассоциаций, используя для сравнения индексов
элементов пользовательскую функцию, указанную в аргументе
cmp_function. В эту функцию передаются два сравниваемых индекса
элементов, а она должна вернуть положительное или отрицательное
число или 0.
Довольно часто нам приходится сортировать что-то по более сложному
критерию, чем просто по алфавиту. Например, пусть в $Files
храниться список имен файлов и подкаталогов в текущем каталоге.
Возможно, мы захотим вывести этот список не только в
лексографическом порядке, но также чтобы все каталоги предшествовали
файлам. В этом случае нам стоит воспользоваться функцией uksort(),
написав предварительно функцию сравнения с двумя параметрами, как
того требует uksort().
// Эта функция должна сравнивать значения $f1 и $f2 и возвращать:
// -1, если $f1<$f2,
// 0, если $f1==$f2
// 1, если $f1>$f2
// Под < и > понимаем следование этих имен в выводимом списке
function FCmp($f1,$f2)
{ // Каталог всегда предшествует файлу
if(is_dir($f1) && !is_dir($f2)) return -1;
// Файл всегда идет после каталога
if(!is_dir($f1) && is_dir($f2)) return 1;
// Иначе сравниваем лексиграфически
if($f1<$f2) return -1; elseif($f1>$f2) return 1; else return 0;
}
// Пусть $Files содержит массив с ключами - именами файлов
// в текущем каталоге. Отсортируем его.
uksort($Files,"FCmp"); //передаем функцию сортировки "по ссылке"
usort
Пользоваетльская сортировка массива.
Синтаксис:
void usort(array arr, function cmp_function)
Функция usort() сортирует массив arr с сохранением
индексных ассоциаций, используя для сравнения индексов элементов
пользовательскую функцию, указанную в аргументе cmp_function.
В эту функцию передаются два сравниваемых индекса элементов, а она
должна вернуть положительное или отрицательное число или 0.
Эта функция как бы является "гибридом" функций 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"
Пример одномерного массива:
function cmp($a, $b) {
if($a==$b) return 0;
return ($a > $b) ? -1 : 1;
}
$a=array (3,2,5,6,1);
usort($a, "cmp");
while(list($key,$val)=each($a)) {
echo "$key: $val\n";
}
При выполнении будет напечатано:
0: 6
1: 5
2: 3
3: 2
4: 1
Пример многомерного массива:
function cmp($a,$b) {
return strcmp($a["fruit"],$b["fruit"]);
};
$fruit[0]["fruit"]="lemons";
$fruit[1]["fruit"]="apples";
$fruit[2]["fruit"]="grapes";
usort($fruit, "cmp");
while(list($key,$val)=each($fruit)) {
echo "\$fruit[$key]:".$val["fruit"]."\n";
}
При сортировке многомерных массивов $a и $b содержит ссылки на
первый индекс массива.
Будет напечатано:
$fruit[0]: apples
$fruit[1]: grapes
$fruit[2]: lemons
array_multisort
Сортировка релятивных массивов.
Синтаксис:
bool array_multisort(array ar1, [, mixed o1 [, mixed t1 ... [, array
...]]])
Функция array_multisort() сортирует многомерные массивы с
сохранением индексной ассоциации, возвращая true при отсутствии
ошибок.
Исходные массивы рассматриваются как столбцы таблицы, сортируемой
построчно. Поэтому массивы должны иметь одинаковое число элементов,
и взаимосвязь между ними, как в строках таблицы, сохраняется.
Приоритетом сортировки пользуются первые массивы. Флаги сортировки
могут указваться для каждого массива, и их действие распространяется
только на тот массив, после которого они указаны.
Флаги определения порядка сортировки (аргументы ox):
(аргументы tx):
ar1 = array("10", 100, 100, "a");
ar2 = array(1, 3, "2", 1);
array_multisort($ar1, $ar2);
// $ar1 = array("10", "a", 100, 100);
// $ar2 = array(1, 1, "2", 4);
Элементы второго массива, соответствующие одинаковым элементам (100
и 100) первого массива, также отсортированны.
$ar = array(array("10", 100, 100, "a"), array(1, 3, "2", 1));
array_multisort($ar[0], SORT_ASC, SORT_STRING,
$ar[1], $SORT_NUMERIC, SORT_DESC);
$ar[0] = ("10", 100, 100, "a") - сортируются как строки по
возрастанию $ar[1] = (1, 3, "2", 1) - сортируются как числа по
убыванию