Сортировка массивов
Сортировка массивов
array_reverse
Расстановка элементов массива в обратном порядке.
Синтаксис:
array array_reverse(array arr [, bool preserve_keys])
Функция array_reverse() возвращает массив, элементы которого следуют в обратном порядке относительно массива, переданного в параметре. При этом связи между ключами и значениями не теряются, если дополнительный параметр preserve_keys = TRUE.
Пример использования функции array_reverse():
<?php
$input = array("php", 4.0, array("green", "red"));
$result = array_reverse($input);
$result_keyed = array_reverse($input, true);
?>
Этот пример сделает оба массива $result и $result_keyed с одинаковыми значениями, но различными ключами. Распечатка массивов $result и $result_keyed будет следующей:
Array( [0] => Array ( [0] => green [1] => red ) [1] => 4 [2] => php)Array( [2] => Array ( [0] => green [1] => red ) [1] => 4 [0] => php)
Примечание: Второй параметр preserve_keys был добавлен в PHP 4.0.3.
Функция поддерживается PHP 4, PHP 5
shuffle
Перемешивание элементов массива.
Синтаксис:
void shuffle(array arr)
Функция shuffle() "перемешивает" список, переданный ей первым параметром arr, так, чтобы его значения распределялись случайным образом. При этом измениться сам массив и ассоциативные массивы воспринимаются как списки.
Пример использования функции shuffle():
<?php
$numbers = range(1, 20);
srand((float)microtime() * 1000000);
shuffle($numbers);
while (list(, $number) = each($numbers)) {
echo "$number ";
}
?>
Замечание: Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку теперь это происходит автоматически.
Функция поддерживается PHP 3 = 3.0.8, PHP 4, PHP 5
sort
Сортировка массива по возрастанию.
Синтаксис:
bool sort(array arr [, int sort_flags])
Функция sort() предназначена для сортировки массивов в порядке возрастания.
Замечание: Эта функция изменяет ключи у отсортированных значений. Т.е. любой ассоциативный массив воспринимается этой функцией как список. После упорядочивания последовательность ключей превращается в 0,1,2,..., а значения нужным образом перераспределяются. Как видим, связи между параметрами ключ=значение не сохраняются, более того - ключи просто пропадают, поэтому сортировать что-либо, отличное от списка, вряд ли целесообразно.
Пример использования функции sort():
<?php
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "fruits[" . $key . "] = " . $val . "n";
}
?>
Этот пример выведет:
fruits[0] = applefruits[1] = bananafruits[2] = lemonfruits[3] = orange
Аргумент sort_flags задает следующие флаги сортировки:
Функция поддерживается PHP 3, PHP 4, PHP 5
rsort
Сортировка массива по убыванию.
Синтаксис:
bool rsort ( array array [, int sort_flags])
Функция rsort() сортирует массив array в порядке убывания (от высших значений к низшим).
Функция возвращает TRUE в случае успешного завершения, и FALSE в противном случае.
Пример использования функции rsort():
<?php
$fruits = array("lemon", "orange", "banana", "apple");
rsort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "$key = $valn";
}
?>
Этот пример выведет:
0 = orange1 = lemon2 = banana3 = apple
Аргумент sort_flags задает следующие флаги сортировки:
Функция поддерживается PHP 3, PHP 4, PHP 5
asort
Сортировка ассоциативного массива по возрастанию.
Синтаксис:
bool asort(array arr [, int sort_flags])
Функция asort() сортирует массив, указанный в ее параметре, так, чтобы его значения шли в алфавитном (если это строки) или возрастающем (для чисел) порядке. При этом сохраняются связи между ключами и соответствующими им значениями, т.е. некоторые пары ключ=значение просто "всплывают" наверх, а некоторые - наоборот, "опускаются".
Функция возвращает true в случае успешного завершения, и false в случае возникновения ошибки.
Пример использования функции asort():
<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "$key = $valn";
}
?>
Пример выведет следующее:
c = appleb = bananad = lemona = orange
Массив $fruits был отсортирован в возрастающем символьном порядке, при этом индексы массива были сохранены.
Метод сортировки может быть изменен при помощи необязательного параметра sort_flags.
Этот параметр может указать, как сравнивать значения (как строки или как числа). Он может принимать следующие предопределенные значения:
Этот параметр был введен в PHP начиная с 4 версии.
Функция поддерживается PHP 3, PHP 4, PHP 5
arsort
Сортировка ассоциативного массива по убыванию.
Синтаксис:
bool arsort(array arr [, int sort_flags])
Функция arsort() сортирует массив arr по убыванию с сохранением индексных ассоциаций.
Эта функция используется главным образом там, где существенен порядок элемента в массиве.
Функция возвращает true в случае успешной сортировки, и false в случае возникновения ошибки.
Пример использования функции arsort():
$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 = oranged = lemonb = bananac = apple
Массив $arr был отсортирован в убывающем символьном порядке, при этом индексы массива были сохранены.
Метод сортировки может быть изменен при помощи необязательного параметра sort_flags.
Этот параметр может указать, как сравнивать значения (как строки или как числа). Он может принимать следующие предопределенные значения:
Этот параметр был введен в PHP начиная с 4 версии.
Функция поддерживается PHP 3, PHP 4, PHP 5
ksort
Сортировка массива по возрастанию ключей.
Синтаксис:
bool ksort(array arr [, int sort_flags])
Функция ksort() сортирует массив в порядке возрастания ключей с сохранением взаимосвязей ключей и значений. Эта функция особенно полезна при сортировке ассоциативных массивов.
Функция возвратит true, если все прошло успешно, и false в противном случае.
Пример использования функции ksort():
<?php
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "$key = $valn";
}
?>
Данный пример выведет:
a = orangeb = bananac = appled = lemon
Аргумент sort_flags задает следующие флаги сортировки:
Функция поддерживается PHP 3, PHP 4, PHP 5
krsort
Сортировка массива по убыванию индексов.
Синтаксис:
bool krsort(array arr [, int sort_flags])
Функция krsort() сортирует ключи в массиве arr в обратном порядке. При этом связка ключей и значений сохраняется. Эта функци полезна при сортировке ассоциативных массивов.
Функция возвращает true в случае успешного завершения, и false в противном случае.
Пример использования функции krsort():
<?php
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
krsort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "$key = $valn";
}
?>
Данный пример выведет:
d = lemonc = appleb = bananaa = orange
Аргумент sort_flags задает следующие флаги сортировки:
Функция поддерживается PHP 3 = 3.0.13, PHP 4, PHP 5
natsort
Выполняет "естественную" сортировку массива.
Синтаксис:
void natsort(array arr)
Функция natsort() сортирует массив arr в естественном для человека порядке с сохранением индексных ассициаций.
Пример использования функции natsort():
<?php
$array1 = $array2 = array("img12.png", "img10.png", "img2.png", "img1.png");
sort($array1);
echo "Стандартная сортировкаn";
print_r($array1);
natsort($array2);
echo "nЕстественная сортировкаn";
print_r($array2);
?>
Этот пример выведет следующее:
Стандартная сортировкаArray( [0] => img1.png [1] => img10.png [2] => img12.png [3] => img2.png)Естественная сортировкаArray( [3] => img1.png [2] => img2.png [1] => img10.png [0] => img12.png)
Функция поддерживается PHP 4, PHP 5
natcasesort
Выполняет естественную сортировку массива без учета регистра символов.
Синтаксис:
void natcasesort(array arr)
Функция natcasesort() сортирует массив arr в естественном для человека порядке с сохранением индексных ассициаций.
Эта функция схожа с natsort(), только не учитывает регистр символов.
Пример использования функции natcasesort():
<?php
$array1 = $array2 = array("IMG0.png", "img12.png", "img10.png",
"img2.png", "img1.png", "IMG3.png");
sort($array1);
echo "Стандартная сортировкаn";
print_r($array1);
natcasesort($array2);
echo "nЕстественная сортировка (без учета регистра)n";
print_r($array2);
?>
Приведенный пример выведет следующее:
Стандартная сортировкаArray( [0] => IMG0.png [1] => IMG3.png [2] => img1.png [3] => img10.png [4] => img12.png [5] => img2.png)Естественная сортировка (без учета регистра)Array( [0] => IMG0.png [4] => img1.png [3] => img2.png [5] => IMG3.png [2] => img10.png [1] => img12.png)
Функция поддерживается PHP 4, PHP 5
uasort
Пользовательская сортировка ассоциативного массива с сохранением индексных ассоциаций.
Синтаксис:
bool uasort(array arr, function cmp_function)
Функция uasort() сортирует массив arr с сохранением индексных ассоциаций, используя для сравнения индексов элементов пользовательскую функцию, указанную аргументом cmp_function.
Эта функция используется главным образом когда соответствие индексов и значений массива существенно.
Функция uasort() возвращает true в случае успешного завершения сортировки, и false в противном случае.
Замечание: Смотрите функции usort() и uksort() для написания пользовательской функции.
Функция поддерживается PHP 3 =3.0.4, PHP 4, PHP 5
uksort
Пользовательская сортировка массива по ключам.
Синтаксис:
bool uksort(array arr, function cmp_function)
Функция uksort() сортирует массив arr по индексам с сохранением индексных ассоциаций, используя для сравнения индексов элементов пользовательскую функцию, указанную в аргументе cmp_function. В эту функцию передаются два сравниваемых индекса элементов, а она должна вернуть положительное или отрицательное число или 0.
Функция uksort() возвращает true в случае успешного завершения сортировки, и FALSE в противном случае.
Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files храниться список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексографическом порядке, но также чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами, как того требует uksort().
1 пример использования функции 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"); //передаем функцию сортировки "по ссылке"
2 пример использования функции uksort():
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a > $b) ? -1 : 1;
}
$a = array(4 => "four", 3 => "three", 20 => "twenty", 10 => "ten");
uksort($a, "cmp");
while (list($key, $value) = each($a)) {
echo "$key: $valuen";
}
?>
Этот пример выведет:
20: twenty10: ten4: four3: three
Функция поддерживается PHP 3 =3.0.4, PHP 4, PHP 5
usort
Пользоваетльская сортировка значений массива.
Синтаксис:
bool usort(array arr, callback cmp_function)
Функция usort() сортирует массив arr без сохраненя индексных ассоциаций, используя для сравнения значений пользовательскую функцию, указанную в аргументе cmp_function. В эту функцию передаются два сравниваемых индекса элементов, а она должна вернуть положительное или отрицательное число или 0.
Эта функция как бы является "гибридом" функций uasort() и sort(). От sort() она отличается тем, что критерий сравнения обеспечивается пользовательской функцией. А от uasort() - тем, что она не сохраняет связей между ключами и значениями, а потому пригодна разве что для сортировки списков.
Пример использования функции usort():
<?php
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, $value) = each($a)) {
echo "$key: $valuen";
}
?>
Пример одномерного массива:
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: $valn";
}
При выполнении будет напечатано:
0: 61: 52: 33: 24: 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
Если необходимо отсортировать массив с различными вторыми ключами, можно поступить следующим образом:
<?php
function arr_sort($a,$b) {
list($key1,$val)=each($a);
list($key2,$val)=each($b);
return strcmp($a[$key1],$b[$key2]);
};
$arr[0]["1-ый элемент"]="яблока";
$arr[1]["2-ый элемент"]="груша";
$arr[2]["3-ый элемент"]="персик";
$arr[3]["4-ый элемент"]="дыня";
$arr[4]["5-ый элемент"]="малина";
$arr[5]["6-ый элемент"]="ананас";
usort($arr,"arr_sort");
echo "<pre>";
print_r($arr);
echo "</pre>";
?>
Приведенный скрипт выведет следующее:
Array( [0] => Array ( [6-ый элемент] => ананас ) [1] => Array ( [2-ый элемент] => груша ) [2] => Array ( [4-ый элемент] => дыня ) [3] => Array ( [5-ый элемент] => малина ) [4] => Array ( [3-ый элемент] => персик ) [5] => Array ( [1-ый элемент] => яблока ))
Функция поддерживается PHP 3 =3.0.3, PHP 4, PHP 5
array_multisort
Сортировка нескольких массивов или многомерного массива.
Синтаксис:
bool array_multisort(array ar1, [, mixed arg [, mixed ... [, array ...]]])
Функция array_multisort() сортирует сразу несколько массивов или многомерные массивы с сохранением индексной ассоциации, возвращая true при отсутствии ошибок.
Исходные массивы рассматриваются как столбцы таблицы, сортируемой построчно. Поэтому массивы должны иметь одинаковое число элементов, и взаимосвязь между ними, как в строках таблицы, сохраняется. Приоритетом сортировки пользуются первые массивы. Флаги сортировки могут указваться для каждого массива, и их действие распространяется только на тот массив, после которого они указаны.
Флаги определения порядка сортировки:
Флаги типа сортировки:
Уазание несколько флагов сортировки после одного массива недопустимо. Флаги сортировки, которые переются после аргумента arr применяются только к этому аргументу. Если после следующего аргумента флаги не указаны, то принимаются флаги по умолчанию (SORT_ASC, SORT_REGULAR).
Пример использования функции array_multisort():
Сортировка нескольких массивов
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", 3);
Элементы второго массива, соответствующие одинаковым элементам (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) - сортируются как числа по убыванию
Функция поддерживается PHP 4, PHP 5