Php сортировка массива по значению. Сортировка массива в php

array_reverse

Расстановка элементов массива в обратном порядке.
Синтаксис:

Array array_reverse(array arr [, bool preserve_keys])

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

Пример использования функции array_reverse():

$result = array_reverse($input);
$result_keyed = array_reverse($input, true);
?>

Этот пример сделает оба массива $result и $result_keyed с одинаковыми значениями, но различными ключами. Распечатка массивов $result и $result_keyed будет следующей:

Array(
=> Array
=> green
=> red
)

=> 4
=> php
Array(
=> Array
=> green
=> red
)

=> 4
=> php
)

Примечание: Второй параметр preserve_keys был добавлен в PHP 4.0.3.

natcasesort

Выполняет естественную сортировку массива без учета регистра символов.
Синтаксис:

Void natcasesort(array arr)

Функция natcasesort() сортирует массив arr в естественном для человека порядке с сохранением индексных ассициаций.
Эта функция схожа с natsort(), только не учитывает регистр символов.
Пример использования функции natcasesort():

"img2.png", "img1.png", "IMG3.png");

sort($array1);

print_r($array1);

natcasesort($array2);
echo "nЕстественная сортировка (без учета регистра)n";
print_r($array2);
?>

Приведенный пример выведет следующее:

Стандартная сортировкаArray(
=> IMG0.png
=> IMG3.png
=> img1.png
=> img10.png
=> img12.png
=> img2.png
)

Естественная сортировка (без учета регистра)
Array(
=> IMG0.png
=> img1.png
=> img2.png
=> IMG3.png
=> img10.png
=> img12.png
)

Функция поддерживается PHP 4, PHP 5

Пользовательская сортировка ассоциативного массива с сохранением индексных ассоциаций.
Синтаксис:

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

Пользовательская сортировка массива по ключам.
Синтаксис:

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"); //передаем функцию сортировки "

array_multisort()

Сортировать несколько массивов или многомерные массивы (PHP 4, PHP 5)

Описание:

Bool array_multisort (array ar1 [, mixed arg [, mixed ... [, array ...]]])

Функция array_multisort() может быть использована для сортировки сразу нескольких массивов или одного многомерного массива в соответствии с одной или несколькими размерностями. Эта функция сохраняет соответствие между ключами и соответствующими им значениями.

Входные массивы рассматриваются как столбцы таблицы, которую нужно отсортировать по строкам - такой подход напоминает поведение выражения SQL ORDER BY. Первый массив имеет проиоритет в процессе сортировки.

Структура аргументов этой функции немного необычна, но удобна. Первым аргументом должен быть массив. Последующие аргументы могут быть как массивами, так и значениями, определяющими порядок сортировки, приведенными в нижеследующем списке.

Значения, определяющие порядок сортировки:

SORT_ASC - сортировать в возрастающем порядке
SORT_DESC - сортировать в убывающем порядке

Флаги типа сортировки:

SORT_REGULAR - сравнивать элементы обычным образом
SORT_NUMERIC - сравнивать элементы, как если бы они были числами
SORT_STRING - сравнивать элементы, как если бы они были строками

Недопустимым является указание двух флагов сортировки одинакового типа после каждого массива. Флаги сортировки, переданные после аргумента ar1, применяются только к этому аргументу - перед тем, как функция начнет обрабатывать следующий массив, эти флаги снова принимают значения по умолчаниюt SORT_ASC и SORT_REGULAR.

Сортировка нескольких массивов

$ar1 = array ("10", 100, 100, "a");
$ar2 = array (1, 3, "2", 1);
array_multisort ($ar1, $ar2);

В вышеприведенном примере, после того, как будет осуществлена сортировка, первый массив будет содержать 10, "a", 100, 100. Второй - 1, 1, "2", 3. Элементы второго массива, соответствующие идентичным элементам первого (100 и 100), также будут отсортированы.

Сортировка многомерного массива

$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar, SORT_ASC, SORT_STRING,
$ar, SORT_NUMERIC, SORT_DESC);

В вышеприведенном примере, после сортировки, первый массив будет содержать 10, 100, 100, "a" (его элементы были отсортированы в возрастающем порядке так, как если бы они были строками), а второй массив будет содержать 1, 3, "2", 1 (элементы отсортированы как числа, в порядке убывания).

Отсортировать массив по значениям используя пользовательскую функцию для сравнения элементов (PHP 3 >= 3.0.3, PHP 4, PHP 5)

Описание:

Bool usort (array &array, callback cmp_function)

Эта функция сортирует элементы массива, используя для сравнения значений пользовательскую функцию. Если вам нужно отсортировать массив по необычному критерию, вы должны использовать эту функцию.

Функция, используемая для сравнения, должна возвращать целое число, меньшее, равное или большее нуля, если первый аргумент соответственно меньше, равен или больше второго.

Замечание: Если два элемента исходного массива равны, их порядок в отсортированном массиве неопределён. До PHP 4.0.6 пользовательские функции сохраняли для таких элеменов порядок в оригинальном массиве, но новый алгоритм сортировки, появившейся в версии 4.1.0 больше не использует это решение и не имеет другого эффективного.

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Пример использования usort()

function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a }

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

while (list($key, $value) = each($a)) {
echo "$key: $value
";
}
?>

0: 1
1: 2
2: 3
3: 5
4: 6

Замечание : Очевидно, что для этого тривиального случая более подходит функция sort().

Пример использования функцией usort() многомерных массивов

function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}

$fruits["fruit"] = "lemons";
$fruits["fruit"] = "apples";
$fruits["fruit"] = "grapes";

usort($fruits, "cmp");

while (list($key, $value) = each($fruits)) {
echo "\$fruits[$key]: " . $value["fruit"] . "
";
}
?>

При сортировке многомерного массива переменные $a и $b содержат ссылки на первые два индекса массива.

Результат выполнения данного примера:

$fruits: apples
$fruits: grapes
$fruits: lemons

Пример использования usort() с методом класса

class TestObj {
var $name;

function TestObj($name)
{
$this->name = $name;
}

/* This is the static comparing function: */
function cmp_obj($a, $b)
{
$al = strtolower($a->name);
$bl = strtolower($b->name);
if ($al == $bl) {
return 0;
}
return ($al > $bl) ? +1: -1;
}
}

$a = new TestObj("c");
$a = new TestObj("b");
$a = new TestObj("d");

usort($a, array("TestObj", "cmp_obj"));

foreach ($a as $item) {
echo $item->name . "
";
}
?>

Результат выполнения данного примера:

B
c
d

Перемешивание элементов массива.
Синтаксис:

Void shuffle(array arr)

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

$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

Сортировка массива по возрастанию.
Синтаксис:

Bool sort(array arr [, int sort_flags])

Функция sort() предназначена для сортировки массивов в порядке возрастания.
Замечание: Эта функция изменяет ключи у отсортированных значений. Т.е. любой ассоциативный массив воспринимается этой функцией как список. После упорядочивания последовательность ключей превращается в 0,1,2,..., а значения нужным образом перераспределяются. Как видим, связи между параметрами ключ=>значение не сохраняются, более того - ключи просто пропадают, поэтому сортировать что-либо, отличное от списка, вряд ли целесообразно.
Пример использования функции sort():

sort($fruits);
reset($fruits);

echo "fruits[" . $key . "] = " . $val . "n";
}
?>

Этот пример выведет:

Fruits = applefruits = bananafruits = lemonfruits = orange


;
SORT_NUMERIC - сравнивает элементы как числа;
SORT_STRING - сравнивает элементы как строки.

Сортировка массива по убыванию.
Синтаксис:

Bool rsort (array array [, int sort_flags])

Функция rsort() сортирует массив array в порядке убывания (от высших значений к низшим).

Функция возвращает TRUE в случае успешного завершения, и FALSE в противном случае.
Пример использования функции rsort():

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 - сравнивает элементы "как есть"
Функция поддерживается PHP 3, PHP 4, PHP 5

Сортировка ассоциативного массива по возрастанию.
Синтаксис:

Bool asort(array arr [, int sort_flags])

Функция asort() сортирует массив, указанный в ее параметре, так, чтобы его значения шли в алфавитном (если это строки) или возрастающем (для чисел) порядке. При этом сохраняются связи между ключами и соответствующими им значениями, т.е. некоторые пары ключ=>значение просто "всплывают" наверх, а некоторые - наоборот, "опускаются".

Функция возвращает true в случае успешного завершения, и false в случае возникновения ошибки.
Пример использования функции asort():

"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 был отсортирован в возрастающем символьном порядке, при этом индексы массива были сохранены.



Функция поддерживается PHP 3, PHP 4, PHP 5

Сортировка ассоциативного массива по убыванию.
Синтаксис:

Bool arsort(array arr [, int sort_flags])

Функция arsort() сортирует массив arr по убыванию с сохранением индексных ассоциаций.
Эта функция используется главным образом там, где существенен порядок элемента в массиве.
Функция возвращает true в случае успешной сортировки, и false в случае возникновения ошибки.
Пример использования функции arsort():

"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
arsort($arr);
reset($arr);
while(list ($key, $val) = each ($arr)) {
echo "$key = $vall";
}

Пример выведет:

A = oranged = lemonb = bananac = apple

Массив $arr был отсортирован в убывающем символьном порядке, при этом индексы массива были сохранены.
Метод сортировки может быть изменен при помощи необязательного параметра sort_flags.
Этот параметр может указать, как сравнивать значения (как строки или как числа). Он может принимать следующие предопределенные значения:
SORT_REGULAR - нормальное сравение значений;
SORT_NUMERIC - сравнивать как числа;
SORT_STRING - сравнивать как строки.
Этот параметр был введен в PHP начиная с 4 версии.
Функция поддерживается PHP 3, PHP 4, PHP 5

Сортировка массива по возрастанию ключей.
Синтаксис:

Bool ksort(array arr [, int sort_flags])

Функция ksort() сортирует массив в порядке возрастания ключей с сохранением взаимосвязей ключей и значений. Эта функция особенно полезна при сортировке ассоциативных массивов.
Функция возвратит true, если все прошло успешно, и false в противном случае.
Пример использования функции ksort():

"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 задает следующие флаги сортировки:
SORT_REGULAR - сравнивает элементы "как есть"
SORT_NUMERIC - сравнивает элементы как числа SORT_STRING - сравнивает элементы как строки
Функция поддерживается PHP 3, PHP 4, PHP 5

Сортировка массива по убыванию индексов.
Синтаксис:

Bool krsort(array arr [, int sort_flags])

Функция krsort() сортирует ключи в массиве arr в обратном порядке. При этом связка ключей и значений сохраняется. Эта функци полезна при сортировке ассоциативных массивов.
Функция возвращает true в случае успешного завершения, и false в противном случае.
Пример использования функции krsort():

"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 задает следующие флаги сортировки:
SORT_REGULAR - сравнивает элементы "как есть"
SORT_NUMERIC - сравнивает элементы как числа SORT_STRING - сравнивает элементы как строки
Функция поддерживается PHP 3 >= 3.0.13, PHP 4, PHP 5

Выполняет "естественную" сортировку массива.
Синтаксис:

Void natsort(array arr)

Функция natsort() сортирует массив arr в естественном для человека порядке с сохранением индексных ассициаций.
Пример использования функции natsort():

sort($array1);
echo "Стандартная сортировкаn";
print_r($array1);

natsort($array2);
echo "nЕстественная сортировкаn";
print_r($array2);
?>

Этот пример выведет следующее:

Стандартная сортировкаArray(
=> img1.png
=> img10.png
=> img12.png
=> img2.png
)

Естественная сортировкаArray(
=> img1.png
=> img2.png
=> img10.png
=> img12.png
)

Функция поддерживается PHP 4, PHP 5

Последнее обновление: 1.11.2015

Функция is_array

Функция is_array() проверяет, является ли переменная массивом, и если является, то возвращает true , иначе возвращает false . Например:

$isar = is_array($technics); echo ($isar==true)?"это массив":"это не массив";

Функции count/sizeof

Функция count() и sizeof() получают количество элементов массива:

$number = count($technics); // то же самое, что // $number = sizeof($technics); echo "В массиве technics $number элементов";

Функции shuffle

Функция shuffle перемешивает элементы массивы случайным образом:

$os = array("Windows 95", "Windows XP", "Windows Vista", "Windows 7", "Windows 8", "Windows 10"); shuffle($os); print_r($os); // один из возможных вариантов // Array ( => Windows 95 => Windows 7 => Windows Vista => Windows XP => Windows 10 => Windows 8)

Функции compact

Функция compact позволяет создать из набора переменных ассоциативный массив, где ключами будут сами имена переменных:

Apple II => Apple => 1978) ?>

Функция compact получает в скобках набор переменных. Каждая переменная указывается в кавычка без знака $. Результатом функции является новый массив.

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

В PHP имеются два типа сортировки: сортировка строк по алфавиту и сортировка чисел по возрастанию/убыванию. Если сортируемые значения представляют строки, то они сортируются по алфавиту, если числа - то они сортируются в порядке возрастания чисел. PHP по умолчанию самостоятельно выбирает тип сортировки.

Для сортировки по возрастанию используется функция asort :

"Lenovo IdeaTab A3500", "samsung" => "Samsung Galaxy Tab 4", "apple" => "Apple iPad Air"); asort($tablets); echo "

    "; foreach ($tablets as $key => $value) { echo "
  • $key: $value
  • "; } echo "
"; ?>

В данном случае значения массива представляют строки, поэтому PHP выберет сортировку по алфавиту. Однако с помощью дополнительного параметра мы можем явно указать интерпретатору PHP тип сортировки. Данный параметр может принимать три значения:

    SORT_REGULAR: автоматический выбор сортировки

    SORT_NUMERIC: числовая сортировка

    SORT_STRING: сортировка по алфавиту

Укажем явно тип сортировки:

Asort($tablets, SORT_STRING);

Чтобы отсортировать массив в обратном порядке, применяется функция arsort :

Arsort($tablets);

Сортировка по ключам

Функция asort производит сортировку по значениям элементов, но также существует и еще и сортировка по ключам. Она представлена функцией ksort :

Ksort($tablets, SORT_STRING);

Сортировка по ключам в обратном порядке выполняется функцией krsort() :

Krsort($tablets);

Естественная сортировка

Хотя выше описанные функции сортировки прекрасно выполняют свою работу, но их возможностей все-таки недостаточно. Например, отсортируем по возрастанию следующий массив:

Windows 10 => Windows 7 => Windows 8) ?>

Так как значения представляют строки, то PHP сортирует по алфавиту. Однако подобная сортировка не учитывает числа и регистр. Поэтому значение "Windows 10" будет идти в самом начале, а не в конце, как должно было быть. И для решения этой проблемы в PHP есть функция natsort() , которая выполняет естественную сортировку:

Windows 7 => Windows 8 => Windows 10) ?>

Если нам надо еще при этом, чтобы сортировка не учитывала регистр, то мы можем применить функцию natcasesort() .

Благодаря своей мощности и гибкости в работе массивы стали непременным атрибутом PHP . Причем, в ряде сложных ситуаций можно задействовать и двумерные массивы PHP . Данная статья посвящена сортировке многомерных массивов в PHP .

Составляющие :

  • Многомерный массив;
  • Встроенные функции PHP usort () , uasort () или uksort () ;
  • Встроенные функции PHP strcasecmp() или strcmp() .

Реализация :
Допустим что, у нас есть массив:

$students = array (1 => array ("name" => "Jack", "grade" => 98.5), 2 => array ("name" => "Bill", "grade" => 90.1), 3 => array ("name" => "Chloe", "grade" => 94.0), 4 => array ("name" => "Taylor", "grade" => 95.1), 5 => array ("name" => "Larry", "grade" => 94.6));

Здесь можно осуществить сортировку двумерного массива PHP по параметру grade (оценка ) (числовая сортировка ) или name (имя ) (сортировка в алфавитном порядке ).

Внешний массив $students состоит из пяти элементов, каждый из которых также представлен в виде отдельного массива. Внутренний массив использует ID студента в качестве ключа и хранит два значения: имя студента и его оценку.

Для сортировки многомерного массива мы задаем собственную функцию. Говорим PHP , что именно ее нужно использовать для вызова встроенных функций usort () , uasort () или uksort () .

Определяемая функция должна принимать два параметра и возвращать значение, указывающее, какой именно параметр идет первым по списку. Отрицательное или false значение говорит о том, что первый параметр указывается до второго. Положительное или true — что вначале идет второй параметр. Нулевое значение (0 ) указывает, что оба параметра равнозначны.

A – Сортировка по оценке (параметр grade) (числовая сортировка)

Определим функцию для сортировки массива по оценке (параметр grade ):

// Функция сортировки по оценке: сортировка по УБЫВАНИЮ. function grade_sort($x, $y) { if ($x[" оценка "] < $y[" оценка "]) { return true; } else if ($x["оценка"] > $y["оценка"]) { return false; } else { return 0; } }

Затем возьмем пользовательскую функцию и осуществим перебор двумерного массива PHP по первому ключу. Выглядит это примерно так:

// $students – наш многомерный массив, а grade_sort – созданная функция usort ($students, " grade_sort ");

Пример :

// Вызвать на печать массив в виде (начальный массив): echo "

Массив в виде

" . print_r($students, 1) . "
"; // Сортировать по оценке (grade): uasort($students, "grade_sort"); echo "

Массив отсортирован по оценке

" . print_r($students, 1) . "
";

PHP будет отправлять внутренние массивы к этой функции для дальнейшей сортировки. Если вам интересно, как все это происходит в деталях, то выведите на экран результаты сравнения значений внутри функции. А саму функцию после PHP создания двумерного массива измените следующим образом:

function grade_sort($x, $y) { static $count = 1; echo “

Iteration $count: {$x[‘оценка’]} vs. {$y[‘оценка’]}

n”; $count++; if ($x[‘ оценка ‘] < $y[‘ оценка ‘]) { return true; } else if ($x[‘ключ1′] > $y[‘ключ1′]) { return false; } else { return 0; } }

Выводя на экран значения $x[‘оценка’] и $y [‘оценка’] , можно увидеть, как вызывается функция сортировки, определенная пользователем.

Можно сократить функцию grade_sort следующим образом:

// Функция числовой сортировки по оценке: сортировка по УБЫВАНИЮ function grade_sort($x, $y) { return ($x["grade"] < $y["grade"]); }

Результаты сортировки двумерного массива PHP по оценке отображены на картинке ниже:

Примечание : Функция usort () сортирует по значениям, но не сохраняет ключи (для внешнего массива ). Если ключи нужны, то лучше использовать функцию uasort () .

B – Сортировка по имени (в алфавитном порядке)

Чтобы отсортировать массив $students по первому ключу, необходимо сравнить две строки. Поэтому в примере с сортировкой в алфавитном порядке воспользуемся функция strcasecmp() (не чувствительна к регистру ) и strcmp() (чувствительна к регистру ). Получившийся двумерный массив PHP будет иметь следующий вид:

// Функция сортировки по имени: function name_sort($x, $y) { return strcasecmp($x["имя"], $y["имя"]); }

Пример :

// Вывести на печать массив в виде (начальный массив): echo "

Массив в виде

" . print_r($students, 1) . "
"; // Сортировка по имени: uasort($students, "name_sort"); echo "

Массив отсортирован по имени

" . print_r($students, 1) . "
";

На скриншоте, приведенном ниже, показан результат сортировки по имени:


Перевод статьи «Sorting multi-dimensional array in PHP » был подготовлен дружной командой проекта .

Массивы очень удобны для обработки большого количества информации. Существует большое количество функций для удобной работы с ними. В частности, сегодня речь пойдёт о сортировке. Ничего нового открывать я не буду, просто познакомлю с самыми нужными для ежедневного кодинга.

Сортирование индексированных массивов: sort() and rsort()

Функция sort() сортирует значения в индексированном массиве в возрастающем порядке. Это означает, что A идёт перед Z, 0 -перед 9. Заглавные буквы перед строчными, буквы перед цифрами. Например:

$myArray = array(1, 2, "a", "b", "A", "B"); sort($myArray); // Отображает "A B a b 1 2" foreach ($myArray as $val) echo "$val ";

rsort() - это sort() наоборот:

$myArray = array(1, 2, "a", "b", "A", "B"); rsort($myArray); // Отображает "2 1 b a B A" foreach ($myArray as $val) echo "$val ";

Все sorting-функции возвращают true при успехе, и false при обломе)

Сортировка ассоциативных массивов: asort() and arsort()

sort() и rsort() очень хороши для индексированных массивов, где не нужно волноваться о связи ключа и значения. Могут получится неожиданности) Например:

$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); sort($movie); // Отобразит "Array ( => Alfred Hitchcock => Rear Window => 112 => 1954)" print_r($movie);

Видно, что произошла путаница, и оригинальная структура «title», «director», «year» and «minutes» поменялась.

Если же вы хотите сортировать ассоциативный массив по первичному ключу, используйте функции asort() и arsort() Эти функции учитывают связь ключей и их значений

За возрастающий порядок сортировки отвечает функция asort():

$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); asort($movie); // Отображает "Array ( => Alfred Hitchcock => Rear Window => 112 => 1954)" print_r($movie);

arsort() наоборот:

$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); arsort($movie); // Отображает "Array ( => 1954 => 112 => Rear Window => Alfred Hitchcock)" print_r($movie);

Сортировка ассоциативных массивов по ключу: ksort() и krsort()

ksort() сортирует по возрастанию значения ключа, krsort() - по убыванию. Как и asort() с arsort(), эта функция сохраняет связь между ключом значением. Пример:

$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); // Отображает "Array ( => Alfred Hitchcock => 112 => Rear Window => 1954)" ksort($movie); print_r($movie); // Отображает "Array ( => 1954 => Rear Window => 112 => Alfred Hitchcock)" krsort($movie); print_r($movie);

Сортировка сложных и многомерных массивов с array_multisort()

Очень мощная функция array_multisort() может сортировать многомерный массив, сохраняя связь между массивами.
Вобщем, сейчас всё увидим:

Сортировка сложных массивов

Сортируем, используя array_multisort(), просто указываем те массивы, которые нужно обратотать:

$directors = array("Stanley Kubrick", "Alfred Hitchcock", "Martin Scorsese"); $titles = array("Full Metal Jacket", "Rear Window", "Mean Streets"); $years = array(1987, 1954, 1973); array_multisort($directors, $titles, $years); print_r($directors); echo "
"; print_r($titles); echo "
"; print_r($years); echo "
";

Этот код отобразит:

Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick)
Array ( => Rear Window => Mean Streets => Full Metal Jacket)
Array ( => 1954 => 1973 => 1987)

Сначала array_multisort() сортирует значения в $directors в возрастающем порядке, затем 2 остальных так же.

А что если мы хотим сортировать, например, чтобы вначале «title»? Просто положите $titles вперёд списка:

Array_multisort($titles, $directors, $years);

Если первый массив содержит какое-то количество id-номеров, тогда array_multisort() сортирует
по этим значениям первый массив, затем - второй, и тд. Пример:

$directors = array("Stanley Kubrick", "Alfred Hitchcock", "Martin Scorsese", "Stanley Kubrick"); $titles = array("Full Metal Jacket", "Rear Window", "Mean Streets", "A Clockwork Orange"); $years = array(1987, 1954, 1973, 1971); array_multisort($directors, $titles, $years); print_r($directors); echo "
"; print_r($titles); echo "
"; print_r($years); echo "
";

Этот код выдаёт следующее - заметьте, что «A Clockwork Orange» перед «Full Metal Jacket»:

Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick => Stanley Kubrick)
Array ( => Rear Window => Mean Streets => A Clockwork Orange => Full Metal Jacket)
Array ( => 1954 => 1973 => 1971 => 1987)

Меняем порядок сортировки

Вы можете пропустить (опционально) flag-аргумент после аргумента массива чтобы менять порядок сортировки:

SORT_ASC
сортировка по возрастанию
SORT_DESC
сортировка по убыванию

Тут сортируем $directors по возрастанию, затем $titles по убыванию:

$directors = array("Stanley Kubrick", "Alfred Hitchcock", "Martin Scorsese", "Stanley Kubrick"); $titles = array("Full Metal Jacket", "Rear Window", "Mean Streets", "A Clockwork Orange"); $years = array(1987, 1954, 1973, 1971); array_multisort($directors, SORT_ASC, $titles, SORT_DESC, $years); print_r($directors); echo "
"; print_r($titles); echo "
"; print_r($years); echo "
";

Вот что вышло: заметьте, что «Full Metal Jacket» теперь перед «A Clockwork Orange»:


Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick => Stanley Kubrick)
Array ( => Rear Window => Mean Streets => Full Metal Jacket => A Clockwork Orange)
Array ( => 1954 => 1973 => 1987 => 1971)

Сортировка многомерных массивов

Сортировка через array_multisort() проходит по первому элементу каждого массива. Если 2 значения одинаковы, сортирвка идёт по 2у элементу и тп.

Это пример, который показывает, как это работает
Сортировка идет по director, потом по title, потом по year:

$movies = array(array("director" => "Alfred Hitchcock", "title" => "Rear Window", "year" => 1954), array("director" => "Stanley Kubrick", "title" => "Full Metal Jacket", "year" => 1987), array("director" => "Martin Scorsese", "title" => "Mean Streets", "year" => 1973), array("director" => "Stanley Kubrick", "title" => "A Clockwork Orange", "year" => 1971)); array_multisort($movies); echo "

"; print_r($movies); echo "
";

Результат:


Array
=> Array
=> Alfred Hitchcock
=> Rear Window
=> 1954
)

=> Array
=> Martin Scorsese
=> Mean Streets
=> 1973
)

=> Array
=> Stanley Kubrick
=> A Clockwork Orange
=> 1971
)

=> Array
=> Stanley Kubrick
=> Full Metal Jacket
=> 1987
)

Как видите, array_multisort() отсортирвал массив по director. Когда имя режиссёра повторилось, («Stanley Kubrick»), сортировка пошла по title.

Чтобы отсортровать в обратном порядке, укажите SORT_DESC-флаг как второй аргумент array_multisort(). Просто!

Итог

В этом уроке мы посмотрели на простые PHP-функции для сортровки массива:

* sort() и rsort() для сортровки индексируемых массивов
* asort() и arsort() для сортровки асоциативных массивов
* ksort() и krsort() для сортровки ассоциативнх массивов по ключу
* array_multisort() для сортировки для сортировки сложных и многомерных массивов

PHP-сортировка массивов очень мощна и проста, можно сортировать быстро и как угодно). ТОлько тут мы изучили аж 13 функций! Чтобы увидеть больше, смотрите

______________

Наткнулся тут на интересный блог – блог про блоги так сказать) Автор обзоры делает)

Подпишись на каталога блога

Очевидно, что может возникнуть необходимость в сортировке массива по значениям ключей . Например, если у нас естьмассив данных о книгах, как в приведенном выше примере, то вполне вероятно, что мы захотимотсортировать книги по именам авторов. Для этого в PHP также не нужно писать много строк кода – можно просто воспользоваться функциейksort() длясортировки по возрастанию (прямой порядоксортировки ) илиkrsort() – длясортировки по убыванию (обратный порядоксортировки ). Синтаксис этих функций опять же аналогичен синтаксису функцииsort() .

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

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

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

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

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

print_r($books);

Пример 7.9. Сортировка массива по ключам (html , txt )

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

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

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

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

Кроме двух простых способов сортировки значений массива (по убыванию или по возрастанию) PHP предлагает пользователю возможность самому задавать критерии длясортировки данных. Критерий задается с помощью функции, имя которой указывается в качестве аргумента для специальных функцийсортировки usort() илиuksort() . По названиям этих функций можно догадаться, чтоusort() сортирует значения элементовмассива , аuksort() значения ключей массива с помощью определенной пользователем функции. Обе функции возвращаютtrue, еслисортировка прошла успешно, иfalse– в противном случае. Их синтаксис выглядит следующим образом:

usort (массив, сортирующая функция)

uksort (массив, сортирующая функция)

Конечно же, нельзя сортировать массив с помощью любой пользовательской функции. Эта функция должна удовлетворять определенным критериям, позволяющим сравнивать элементымассива . Как должна быть устроена сортирующая функция? Во-первых, она должна иметь два аргумента. В них интерпретатор будет передавать парызначений элементов для функцииusort() илиключей массива для функцииuksort() . Во-вторых, сортирующая функция должна возвращать:

    целое число, меньшее нуля, если первый аргумент меньше второго;

    число, равное нулю, если два аргумента равны;

    число большее нуля, если первый аргумент больше второго.

Как и для других функций сортировки , для функцииusort() существует аналог, не изменяющийзначения ключей , – функцияuasort() .

Пример 7.10. Допустим, у нас естьмассив , содержащий такие сведения о литературных произведениях, как название, автор и год создания. Мы хотим упорядочить книги по дате создания.

// массив выглядит таким образом:

$books = array("Герой нашего времени" =>

array ("Лермонтов", 1840),

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

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

"Идиот" => array("Достоевский",1868));

/* можно, конечно переписать этот массив

по-другому, сделав год издания, например,

индексом, но гораздо удобнее написать свою

функцию для сортировки */

uasort($books,"cmp");

// сортируем массив с помощью функции cmp

foreach ($books as $key => $book) {

echo "$book: \"$key\"
";

function cmp($a,$b){

// функция, определяющая способ сортировки

if ($a < $b) return -1;

elseif ($a==$b) return 0;

Пример 7.10. Сортировка с помощью пользовательских функций (html , txt )

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

Пушкин: "Руслан и Людмила"

Лермонтов: "Герой нашего времени"

Толстой: "Война и мир"

Достоевский: "Идиот"

Мы применили нашу собственную функцию сортировки ко всем элементаммассива . Далее рассмотрим, какприменить к элементам массива любую другую пользовательскую функцию .

Применение функции ко всем элементам массива

Функция array_walk(массив, функция [, данные]) применяет созданную пользователем функцию функция ко всем элементам массива массив и возвращает true в случае успешного выполнения операции и false – в противном случае.

Пользовательская функция, как правило, имеет два аргумента, в которые поочередно передаются значение и ключ каждого элемента массива . Но если при вызове функции array_walk() указан третий аргумент, то он будет рассмотрен как значение третьего аргумента пользовательской функции, смысл которого определяет сам пользователь. Если функция пользователя требует больше аргументов, чем в нее передано, то при каждом вызове array_walk() будет выдаваться предупреждение.

Если необходимо работать с реальными значениями массива , а не с их копиями, следует передавать аргумент в функцию по ссылке. Однако нужно иметь в виду, что нельзя добавлять или удалять элементы массива и производить действия, изменяющие сам массив , поскольку в этом случае результат работы array_walk() считается неопределенным.

$books1 = array(

"А.С. Пушкин"=>"Руслан и Людмила",

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

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

function try_walk($val,$key,$data){

echo "$data \"$val\" написал $key
";

// $book1 функцию try_walk

array_walk($books1,"try_walk","Роман");

Пример 7.11. Применение функции ко всем элементам массива (html , txt )

Роман "Руслан и Людмила" написал А.С. Пушкин

Роман "Война и мир" написал Л.Н. Толстой

Роман "Герой нашего времени"

написал М.Ю. Лермонтов

Заметим, что мы не изменили значений у элементов массива . Чтобы их изменить, надо было передавать значения в переменную $var функции try_walk по ссылке.

$books1 = array(

"А.С. Пушкин"=>"Руслан и Людмила",

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

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

// создаем функцию, которую хотим

// применить к элементам массива

function try_walk(&$val,$key){

$key = "

$val = "Название: \"" . $val ."\"

";

// применяем ко всем элементам массива

// $book1 функцию try_walk

array_walk($books1,"try_walk");

print_r($books1);

Пример 7.12. Применение функции ко всем элементам массива. Вариант 2 (html , txt )

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

Название: "Руслан и Людмила"

Название: "Война и мир"

Название: "Герой нашего времени"

Array ([А.С. Пушкин] =>

Название: "Руслан и Людмила"

[Л.Н. Толстой] =>

Название: "Война и мир"

[М.Ю. Лермонтов] =>

Название: "Герой нашего времени")

Выделение подмассива

Функция array_slice

Поскольку массив – это набор элементов, вполне вероятно, потребуется выделить из него какой-нибудь поднабор. В PHP для этих целей есть функцияarray_slice . Ее синтаксис таков:

array_slice (массив,

номер_элемента [, длина])

Эта функция выделяет подмассив длиныдлинавмассиве массив, начиная с элемента, номер которого задан параметромномер_элемента. Положительныйномер_элементауказывает на порядковый номер элемента относительно началамассива , отрицательный – на номер элемента с концамассива .

$arr = array(1,2,3,4,5);

$sub_arr = array_slice($arr,2);

print_r($sub_arr);

выведет Array ( => 3 =>4 => 5),

т.е. подмассив, состоящий из элементов

$sub_arr = array_slice($arr,-2);

print_r($sub_arr);

// выведет Array ( => 4 => 5),

// т.е. подмассив, из элементов 4, 5

Пример 7.13. Использование функции array_slice() (html , txt )

Если задать параметр длинапри использованииarray_slice , то будетвыделен подмассив , имеющий ровно столько элементов, сколько задано этим параметром. Длину можно указывать и отрицательную. В этом случае интерпретатор удалит с концамассива число элементов, равное модулю параметрадлина.

$arr = array(1,2,3,4,5);

$sub_arr = array_slice($arr, 2, 2);

// содержит массив из элементов 3, 4

$sub = array_slice($arr,-3, 2);

// тоже содержит массив из элементов 3, 4

$sub1 = array_slice($arr,0, -1);

// содержит массив из

// элементов 1, 2, 3, 4

$sub2 = array_slice($arr,-4, -2);

// содержит массив из элементов 2, 3

Пример 7.14. Использование функции array_slice(). Вариант 2 (html , txt )

Функция array_chunk

Есть еще одна функция, похожая на array_slice() – этоarray_chunk() . Она разбиваетмассив на несколько подмассивов заданной длины. Синтаксис ее такой:

array_chunk (массив, размер

[, сохранять_ключи])

В результате работы array_chunk() возвращает многомерныймассив , элементы которого представляют собой полученные подмассивы. Если задать параметр сохранятьключи какtrue, то при разбиении будут сохраненыключи исходногомассива . В противном случаеключи элементов заменяются числовыми индексами, которые начинаются с нуля.

Пример 7.15. У нас есть список приглашенных, оформленный в видемассива их фамилий. У нас имеются столики на три персоны. Поэтому нужно распределить всех приглашенных по трое.

$persons = array("Иванов", "Петров",

"Сидорова","Зайцева", "Волкова");

$triples = array_chunk($persons,3);

// делим массив на подмассивы

// по три элемента

foreach ($triples as $k => $table){

// выводим полученные тройки

echo "За столиком номер $k сидят:

    ";

    foreach ($table as $pers)

    echo "

  • $pers";

    echo "

";

Пример 7.15. Использование функции array_chunk() (html , txt )

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

за столиком номер 0 сидят:

Сидорова

за столиком номер 1 сидят:

Зайцева

Волкова

Сумма элементов массива

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

В качестве примера использования этой функции приведем решение более сложной задачи, чем просто вычисление суммы элементов . Этот пример также иллюстрирует применение функцииarray_slice() , которую мы обсуждали чуть раньше.

Пример 7.16. Пусть данмассив натуральных чисел. Нужно найти в нем такое число, чтосумма элементов справа от него равнасумме элементов слева от него.

//массив задается функцией array

$arr = array(2,1,3,4,5,6,4);

// перебираем каждый элемент массива $arr.

// Внутри цикла текущий ключ массива

// содержится в переменной $k,

// текущее значение – в переменной $v

foreach ($arr as $k => $val){

// синтаксис array array_slice (

array array,int offset [,int length])

// array_slice выделяет подмассив

// длины length в массиве array,

// начиная с элемента offset.

$out_next = array_slice($arr,$p);

// идущих после текущего

$out_prev = array_slice($arr,0,$k);

// получаем массив элементов,

// идущих перед текущим

// функция mixed array_sum (array array)

// подсчитывает сумму элементов массива array

$next_sum = array_sum($out_next);

$prev_sum = array_sum($out_prev);

// если сумма элементов до текущего равна

// сумме элементов после, то выводим

// значение текущего элемента

if ($next_sum==$prev_sum)

echo "value:$val";

// можно посмотреть, что представляют собой

// рассмотренные массивы на каждом шаге

// print_r($out_next); echo "
";

// print_r($out_prev);

// echo "$next_sum, $prev_sum
";

echo "


";

Пример 7.16. Программа поиска числа, такого что сумма элементов справа от него равна сумме элементов слева от него (html , txt )

Заключение

Итак, подведем итоги. В этой лекции мы изучили ряд функций, упрощающих работу с массивами данных. Мы рассмотрели функции дляпоиска значения среди элементов массива ; функции длясортировки элементов массива , как по ихзначениям , так и поключам ; функции, позволяющиеприменять ко всем элементам массива функцию, созданную пользователем . Кроме того, мы изучили функцию,выделяющую подмассивы из элементовмассива , и функцию, вычисляющуюсумму всех элементов массива . Использование всех этих функций было продемонстрировано на примерах. Все функции для работы смассивами доступны без каких-либо конфигурационных настроек PHP, и пользоваться ими можно абсолютно свободно. Так что, прежде чем изобретать велосипед, загляните в руководство по языку PHP: – вполне возможно, что кто-то сделал это до вас.




Top