Справочник по PHP : Функции работы с данными : Работа с массивами : Сортировка массивов
смотрим также
Материал из Справочник Web-языков
Содержание |
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] = apple fruits[1] = banana fruits[2] = lemon fruits[3] = orange
Аргумент sort_flags задает следующие флаги сортировки:
- SORT_REGULAR - сравнивает элементы "как есть";
- SORT_NUMERIC - сравнивает элементы как числа;
- SORT_STRING - сравнивает элементы как строки.
Функция поддерживается 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 = orange 1 = lemon 2 = banana 3 = apple
Аргумент sort_flags задает следующие флаги сортировки:
- SORT_REGULAR - сравнивает элементы "как есть"
- SORT_NUMERIC - сравнивает элементы как числа
- SORT_STRING - сравнивает элементы как строки
Функция поддерживается 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 = apple b = banana d = lemon a = orange
Массив $fruits был отсортирован в возрастающем символьном порядке, при этом индексы массива были сохранены.
Метод сортировки может быть изменен при помощи необязательного параметра sort_flags.
Этот параметр может указать, как сравнивать значения (как строки или как числа). Он может принимать следующие предопределенные значения:
- SORT_REGULAR - нормальное сравение значений;
- SORT_NUMERIC - сравнивать как числа;
- SORT_STRING - сравнивать как строки.
Этот параметр был введен в 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
l"; }
Пример выведет:
a = orange d = lemon b = banana c = apple
Массив $arr был отсортирован в убывающем символьном порядке, при этом индексы массива были сохранены.
Метод сортировки может быть изменен при помощи необязательного параметра sort_flags.
Этот параметр может указать, как сравнивать значения (как строки или как числа). Он может принимать следующие предопределенные значения:
- SORT_REGULAR - нормальное сравение значений;
- SORT_NUMERIC - сравнивать как числа;
- SORT_STRING - сравнивать как строки.
Этот параметр был введен в 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 = orange b = banana c = apple d = lemon
Аргумент sort_flags задает следующие флаги сортировки:
- SORT_REGULAR - сравнивает элементы "как есть"
- SORT_NUMERIC - сравнивает элементы как числа
- SORT_STRING - сравнивает элементы как строки
Функция поддерживается 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 = lemon c = apple b = banana a = orange
Аргумент sort_flags задает следующие флаги сортировки:
- SORT_REGULAR - сравнивает элементы "как есть"
- SORT_NUMERIC - сравнивает элементы как числа
- SORT_STRING - сравнивает элементы как строки
Функция поддерживается 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 // Под понимаем следование этих имен в выводимом списке 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; 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: twenty 10: ten 4: four 3: 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Пример одномерного массива:
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: 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Если необходимо отсортировать массив с различными вторыми ключами, можно поступить следующим образом:
<?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 ""; print_r($arr); echo ""; ?>Приведенный скрипт выведет следующее:
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 при отсутствии ошибок.
Исходные массивы рассматриваются как столбцы таблицы, сортируемой построчно. Поэтому массивы должны иметь одинаковое число элементов, и взаимосвязь между ними, как в строках таблицы, сохраняется. Приоритетом сортировки пользуются первые массивы. Флаги сортировки могут указваться для каждого массива, и их действие распространяется только на тот массив, после которого они указаны.
Флаги определения порядка сортировки:
- SORT_ASC - сортировка в порядке возрастания (по умолчанию)
- SORT_DESC - сортировка в порядке убывания
Флаги типа сортировки:
- SORT_REGULAR - сравнивать элементы как есть (по умолчанию)
- SORT_NUMERIC - сравнивать элементы как числа
- SORT_STRING - сравнивать элементы как строки
Уазание несколько флагов сортировки после одного массива недопустимо. Флаги сортировки, которые переются после аргумента 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