Php сортировка многомерного массива по полю. Как отсортировать многомерный массив? Пример #3 Сортировка результатов из базы данных

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

Сортирование индексированных массивов: 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 4, PHP 5, PHP 7)

array_multisort — Сортирует несколько массивов или многомерные массивы

Описание

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

Array1_sort_order

Порядок для сортировки вышеуказанного аргумента array . Или SORT_ASC для сортировки по возрастанию, или SORT_DESC для сортировки по убыванию.

Этот аргумент может меняться местами с array1_sort_flags или вообще быть пропущенным. В этом случае подразумевается значение SORT_ASC .

Array1_sort_flags

Настройки сортировки для вышеуказанного аргумента array :

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

  • SORT_REGULAR - обычное сравнение элементов (без изменения типов)
  • SORT_NUMERIC - сравнение элементов как чисел
  • SORT_STRING - сравнение элементов как строк
  • SORT_LOCALE_STRING - сравнение элементов как строк, учитывая текущую локаль. Используется локаль, которую можно менять с помощью функции setlocale()
  • SORT_NATURAL - сравнение элементов как строк с использованием алгоритма "natural order", так же как в функции natsort()
  • SORT_FLAG_CASE - может быть объединен (бинарное OR) с SORT_STRING или SORT_NATURAL для сортировки без учета регистра

Этот аргумент может меняться местами с array1_sort_order или вообще быть пропущенным. В этом случае подразумевается значение SORT_REGULAR .

...

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

Возвращаемые значения

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

Список изменений

Примеры

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

$ar1 = array(10 , 100 , 100 , 0 );
$ar2 = array(1 , 3 , 2 , 4 );
array_multisort ($ar1 , $ar2 );

Var_dump ($ar1 );
var_dump ($ar2 );
?>

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

array(4) { => int(0) => int(10) => int(100) => int(100) } array(4) { => int(4) => int(1) => int(2) => int(3) }

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

$ar = array(
array("10" , 11 , 100 , 100 , "a" ),
array(1 , 2 , "2" , 3 , 1 )
);
array_multisort ($ar [ 0 ], SORT_ASC , SORT_STRING ,
$ar [ 1 ], SORT_NUMERIC , SORT_DESC );
var_dump ($ar );
?>

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

array(2) { => array(5) { => string(2) "10" => int(100) => int(100) => int(11) => string(1) "a" } => array(5) { => int(1) => int(3) => string(1) "2" => int(2) => int(1) } }

Пример #3 Сортировка результатов из базы данных

В этом примере, каждый элемент массива data представляет собой ряд таблицы. Такой тип данных типичен для записей базы данных.

Примерные данные:

# том | издание volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7

Данные представлены в виде массива с именем data . Обычно их можно получить, к пример, с помощью цикла из функции mysql_fetch_assoc() .

$data = array("volume" => 67 , "edition" => 2 );
$data = array("volume" => 86 , "edition" => 1 );
$data = array("volume" => 85 , "edition" => 6 );
$data = array("volume" => 98 , "edition" => 2 );
$data = array("volume" => 86 , "edition" => 6 );
$data = array("volume" => 67 , "edition" => 7 );
?>

В нашем примере мы будем сортировать по volume в убывающем порядке, а по edition - в возрастающем.

У нас есть массив строк, но array_multisort() необходим массив столбцов, поэтому сначала мы используем следующий код для получения столбцов, а потом выполним сортировку.

// Получение списка столбцов
foreach ($data as $key => $row ) {
$volume [ $key ] = $row [ "volume" ];
$edition [ $key ] = $row [ "edition" ];
}

// Сортируем данные по volume по убыванию и по edition по возрастанию
// Добавляем $data в качестве последнего параметра, для сортировки по общему ключу
array_multisort ($volume , SORT_DESC , $edition , SORT_ASC , $data );
?>

Доброго времени суток, уважаемые читатели нашего блога! На нашем сайте мы уже касались темы массивов и это был пример того, как сделать . Также уже была статья о том, для решения этой задачи тоже были использованы массивы. А сегодня речть пойдет о том, как отсортировать многомерный массив . Итак, приступим.
Возьмем массив «goods» следующего вида:

200, "manufacture" => "ТОО Целина"); $goods = array("price" => 400, "manufacture" => "ИП Девяткин"); $goods = array("price" => 800, "manufacture" => "АО Аграрник"); $goods = array("price" => 790, "manufacture" => "ЗАО Красный Восток"); ?>

Необходимо отсортировать данный массив по ключу. Для этого воспользуемся функцией «ksort»:

ksort ($goods); print_r($goods); ?>

В результате получаем отсортированный массив по ключу:

Array ( => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина) => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток))

Как видим, ключи идут в порядке возрастания от 45 до 89. Теперь нужно отсортировать массив по значению ключа «price» для этого воспользуемся функцией «uasort» и напишем для неё пользовательскую функцию «sort_p»:

sort_p ($a, $b) { return strcmp($a["price"], $b["price"]); } uasort ($goods, "sort_p" ); print_r($goods); ?>

В результате получаем отсортированный массив по ключу «price»:

Array ( => Array ( => 200 => ТОО Целина) => Array ( => 400 => ИП Девяткин) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 800 => АО Аграрник))

Как видим, значения ключа «price» идут в порядке возрастания от 200 до 800. Чтобы значения ключа «price» шли в обратном порядке, по убыванию, поменяем местами параметры функции «strcmp» в пользовательской функции «sort_p»:

b ["price"], $a ["price"]); } uasort($goods, "sort_p"); print_r($goods); ?>

Получим следующий результат:

Array ( => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина))

Как видим, теперь значения ключа «price» идут в порядке убывания от 800 до 200. Теперь нужно отсортировать массив по значению двух ключей «manufacture» и «price» для этого напишем пользовательскую функцию «sort_pm»:

sort_pm ($a, $b) { $r1 = strcmp($a["manufacture"], $b["manufacture"]$a["price"], $b["price"]) : $r1; } uasort($goods, "sort_pm" ); print_r($goods); ?>

Теперь сортировка происходит по значениям двух ключей в порядке возрастания, приоритетным является ключ «manufacture».

Array ( => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина))

Если для Вас более приоритетным являются значения ключа «price», то поменяйте местами параметры функций «strcmp» и запишите функцию «sort_pm» следующим образом:

$a["price"], $b["price"] ); return ($r1 == 0) ? strcmp() : $r1; } uasort($goods, "sort_pm"); print_r($goods); ?>

То есть были изменены параметры функций «strcmp». Теперь значения ключа «price» будут приоритетнее, значит сортировка в первую очередь будет осуществлятся по ним, затем будут отсортированы значения ключа «manufacture». Поясним на следующем примере:

200, "manufacture" => "ТОО Целина"); $goods = array("price" => 400, "manufacture" => "ИП Девяткин"); $goods = array("price" => 400, "manufacture" => "АО Праздник"); $goods = array("price" => 800, "manufacture" => "АО Аграрник"); $goods = array("price" => 790, "manufacture" => "ЗАО Красный Восток"); function sort_pm($a, $b) { $r1 = strcmp($a["price"], $b["price"] ); return ($r1 == 0) ? strcmp($a["manufacture"], $b["manufacture"] ) : $r1; } uasort($goods, "sort_pm"); print_r($goods); ?>

Последнее обновление: 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() .

Похожие статьи