Php sort array with arrays

array_multisort

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

Ассоциативные ( string ) ключи будут сохранены, но числовые ключи будут переиндексированы.

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

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

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

Настройки сортировки для вышеуказанного аргумента 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 в случае возникновения ошибки.

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

Версия Описание
5.4.0 Добавлены SORT_NATURAL и SORT_FLAG_CASE в возможные флаги сортировки array1_sort_flags .
5.3.0 Добавлен SORT_LOCALE_STRING в возможные флаги сортировки array1_sort_flags .

Примеры

Пример #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) < [0]=>int(0) [1]=> int(10) [2]=> int(100) [3]=> int(100) > array(4) < [0]=>int(4) [1]=> int(1) [2]=> int(2) [3]=> int(3) >

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

Читайте также:  What is google maps javascript api

$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) < [0]=>array(5) < [0]=>string(2) "10" [1]=> int(100) [2]=> int(100) [3]=> int(11) [4]=> string(1) "a" > [1]=> array(5) < [0]=>int(1) [1]=> int(3) [2]=> string(1) "2" [3]=> int(2) [4]=> 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’ ];
>

Читайте также:  Double value to int in java

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

Теперь данные отсортированы и будут выглядеть вот так:

volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7

Пример #4 Сортировка без учета регистра

Обе константы SORT_STRING и SORT_REGULAR учитывают регистр при сортировке, строки, начинающиеся с заглавной буквы будут выставлены раньше строк, начинающихся со строчной буквы.

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

$array = array( ‘Alpha’ , ‘atomic’ , ‘Beta’ , ‘bank’ );
$array_lowercase = array_map ( ‘strtolower’ , $array );

array_multisort ( $array_lowercase , SORT_ASC , SORT_STRING , $array );

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

Array ( [0] => Alpha [1] => atomic [2] => bank [3] => Beta )

Смотрите также

  • usort() — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
  • Сравнение функций сортировки массивов

Источник

Sorting Arrays

PHP has several functions that deal with sorting arrays, and this document exists to help sort it all out.

  • Some sort based on the array keys, whereas others by the values: $array[‘key’] = ‘value’;
  • Whether or not the correlation between the keys and values are maintained after the sort, which may mean the keys are reset numerically (0,1,2 . )
  • The order of the sort: alphabetical, ascending (low to high), descending (high to low), natural, random, or user defined
  • Note: All of these sort functions act directly on the array variable itself, as opposed to returning a new sorted array
  • If any of these sort functions evaluates two members as equal then they retain their original order. Prior to PHP 8.0.0, their order were undefined (the sorting was not stable).
Читайте также:  Php отдаем файлы эффективно

Sorting function attributes

Function name Sorts by Maintains key association Order of sort Related functions
array_multisort() value string keys yes, int keys no first array or sort options array_walk()
asort() value yes ascending arsort()
arsort() value yes descending asort()
krsort() key yes descending ksort()
ksort() key yes ascending krsort()
natcasesort() value yes natural, case insensitive natsort()
natsort() value yes natural natcasesort()
rsort() value no descending sort()
shuffle() value no random array_rand()
sort() value no ascending rsort()
uasort() value yes user defined uksort()
uksort() key yes user defined uasort()
usort() value no user defined uasort()

User Contributed Notes 2 notes

While this may seem obvious, user-defined array sorting functions ( uksort(), uasort(), usort() ) will *not* be called if the array does not have *at least two values in it*.

function usortTest ( $a , $b ) var_dump ( $a );
var_dump ( $b );
return — 1 ;
>

$test = array( ‘val1’ );
usort ( $test , «usortTest» );

$test2 = array( ‘val2’ , ‘val3’ );
usort ( $test2 , «usortTest» );

The first array doesn’t get sent to the function.

Please, under no circumstance, place any logic that modifies values, or applies non-sorting business logic in these functions as they will not always be executed.

Another way to do a case case-insensitive sort by key would simply be:

uksort ( $array , ‘strcasecmp’ );
?>

Since strcasecmp is already predefined in php it saves you the trouble to actually write the comparison function yourself.

Источник

Оцените статью