Php sort array associative arrays

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

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

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

ksort() и krsort() – сортирует массив по ключу.

$array = array( 3 => 'яблоко', 1 => 'апельсин', 5 => 'виноград' ); // По возрастанию: ksort($array); print_r($array); // По убыванию: krsort($array); print_r($array);

Результат:

Array ( [1] => апельсин [3] => яблоко [5] => виноград ) Array ( [5] => виноград [3] => яблоко [1] => апельсин )

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

Функции sort() и rsort() сортирует массив по значению, при этом не сохраняя ключи.

$array = array( 3 => 'яблоко', 1 => 'апельсин', 5 => 'виноград' ); // По возрастанию: sort($array); print_r($array); // По убыванию: rsort($array); print_r($array);

Результат:

Array ( [0] => апельсин [1] => виноград [2] => яблоко ) Array ( [0] => яблоко [1] => виноград [2] => апельсин )

Чтобы сохранить ключи применяется функции asort() и arsort() .

$array = array( 3 => 'яблоко', 1 => 'апельсин', 5 => 'виноград' ); // По возрастанию: asort($array); print_r($array); // По убыванию: arsort($array); print_r($array);

Результат:

Array ( [1] => апельсин [5] => виноград [3] => яблоко ) Array ( [3] => яблоко [5] => виноград [1] => апельсин )

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

Выше приведенные функции по умолчанию используют алгоритм Quicksort (быстрая сортировка). Чтобы изменить алгоритм нужно вторым аргументом указать флаг:

SORT_REGULAR Обычное сравнение элементов (без изменения типов)
SORT_NUMERIC Числовое сравнение элементов
SORT_STRING Строковое сравнение элементов
SORT_LOCALE_STRING Сравнивает элементы как строки с учетом текущей локали.
SORT_NATURAL Также как natsort()
SORT_FLAG_CASE Может быть объединен с SORT_STRING или SORT_NATURAL для сортировки строк без учета регистра.

Привычную для человека сортировку делают функции natsort() , natcasesort() или флаг SORT_NATURAL .
natcasesort() сортирует массив без учета регистра символов.

Разницу можно увидеть в примере:

$array = array(-1, 0, 10, 'текст', 'a', 'b'); // Quicksort: sort($array); print_r($array); // Natural order: natsort($array); print_r($array);

Результат:

Array ( [0] => -1 [1] => a [2] => b [3] => 0 [4] => текст [5] => 10 ) Array ( [0] => -1 [1] => 0 [2] => 10 [4] => a [5] => b [3] => текст )

У natsort() нет возможности изменить направление сортировки, поэтому можно применить функцию array_reverse() .

natsort($array); $array = array_reverse($array); print_r($array);

Результат:

Array ( [0] => текст [1] => b [2] => a [3] => 10 [4] => 0 [5] => -1 )

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

array_multisort() сортирует многомерные массивы по значению, также может отсортировать сразу несколько массивов.

$array = array( array(20, 222, 2, 22), array(10, 111, 1, 11), ); array_multisort($array); print_r($array);

Результат:

Array ( [0] => Array( [0] => 10 [1] => 111 [2] => 1 [3] => 11 ) [1] => Array( [0] => 20 [1] => 222 [2] => 2 [3] => 22 ) )

Чтобы изменить направление сортировки вторым аргументом функции указывается SORT_ASC или SORT_DESC .

array_multisort($array, SORT_DESC); print_r($array);

Сортировка многомерного массива по значению одного ключа

Есть несколько вариантов, первый – uasort() , сортирует массив, используя пользовательскую функцию для сравнения элементов и сохранением ключей.

Читайте также:  Checking if string is empty php

В примере сортировка идет по ключу « count ».

$array = array( array( 'sku' => '645908-463', 'count' => '1' ), array( 'sku' => '64590644', 'count' => '20' ), array( 'sku' => '7543', 'count' => '2' ) ); // По возрастанию: function cmp_function($a, $b) < return ($a['count'] >$b['count']); > uasort($array, 'cmp_function'); print_r($array); // По убыванию: function cmp_function_desc($a, $b) < return ($a['count'] < $b['count']); >uasort($array, 'cmp_function_desc'); print_r($array);

Результат:

Array ( [0] => Array( [sku] => 645908-463 [count] => 1 ) [2] => Array( [sku] => 7543 [count] => 2 ) [1] => Array( [sku] => 64590644 [count] => 20 ) ) Array ( [1] => Array( [sku] => 64590644 [count] => 20 ) [2] => Array( [sku] => 7543 [count] => 2 ) [0] => Array( [sku] => 645908-463 [count] => 1 ) )

Второй вариант на основе функции array_multisort() :

function array_multisort_value() < $args = func_get_args(); $data = array_shift($args); foreach ($args as $n =>$field) < if (is_string($field)) < $tmp = array(); foreach ($data as $key =>$row) < $tmp[$key] = $row[$field]; >$args[$n] = $tmp; > > $args[] = &$data; call_user_func_array('array_multisort', $args); return array_pop($args); > $array = array( array( 'sku' => '645908-463', 'count' => '1' ), array( 'sku' => '64590644', 'count' => '20' ), array( 'sku' => '7543', 'count' => '2' ) ); $array = array_multisort_value($array, 'count', SORT_DESC); print_r($array);

Перемешать массив

Функция shuffle() перемешивает массив в случайном порядке, не сохроняя ключи.

$array = array( 1 => 'яблоко', 2 => 'апельсин', 3 => 'виноград' ); shuffle($array); print_r($array); shuffle($array); print_r($array);

Результат:

Array ( [0] => виноград [1] => яблоко [2] => апельсин ) Array ( [0] => виноград [1] => апельсин [2] => яблоко ) 

Источник

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).
Читайте также:  Ide eclipse for 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.

Источник

Sorting Associative Arrays

It’s often desirable to keep the key/value associations when sorting associative arrays. To maintain the key/value association the asort( ) and arsort( ) functions are used. Rather than sort on element values, the ksort( ) and krsort( ) functions rearrange elements in an array by sorting on the keys or the indexes.

When you try to use sort() or rsort() functions with an associative array, it works but the keys are then all lost. To keep key-value association intact, you must use one of the following sorting functions:

  1. array as input
  2. Sorting flags (optional) to modify the behavior of the sort.

asort Sort associative arrays by values in ascending order

 'II','four' => 'IV', 'three' => 'III', 'one' => 'I']; asort($a); print_r($a); /* Prints Array ( [one] => I [two] => II [three] => III [four] => IV ) */

Like sort( ) this function rearranges the elements in the subject array from lowest to highest. The following example shows a simple array sorted by asort( ) :

"kk", "e"=>"zz", "z"=>"hh", "a"=>"rr"); asort($map); print_r($map);

The print_r( ) function outputs the structure of the sorted array:

Array ( [z] => hh [o] => kk [a] => rr [e] => zz )

When assort( ) and arsort( ) are used on nonassociative arrays, the order of the elements is arranged in sorted order, but the indexes that access the elements don’t change. This might seem a bit weird; effectively the indexes are treated as association keys in the resulting array. The following example shows what is happening:

Array ( [2] => 3 [5] => 8 [3] => 16 [1] => 19 [0] => 24 [4] => 56 [6] => 171 )

arsort Sort associative arrays by values in descending order

 'II','four' => 'IV', 'three' => 'III', 'one' => 'I']; arsort($a); print_r($a); /* Prints Array ( [four] => IV [three] => III [two] => II [one] => I ) */

Like rsort( ) this function rearranges the elements in the subject array from highest to lowest. The following example shows a simple array sorted by arsort( ) :

"kk", "e"=>"zz", "z"=>"hh", "a"=>"rr"); arsort($map); print_r($map); /* Prints Array ( [e] => zz [a] => rr [o] => kk [z] => hh ) */

Sorting Associative Arrays Alphabetically

24, 'nt'=>19, 'te'=>3, 'sn'=>16, 'fs'=>56, 'et'=>8, 'oso'=>171]; asort($a); print_r($a);

The output of the example shows the result:

//Numerically sorted Array ( [te] => 3 [et] => 8 [sn] => 16 [nt] => 19 [tf] => 24 [fs] => 56 [oso] => 171 )

By default, PHP sorts strings in alphabetical order and numeric values in numeric order. An optional parameter, sorting flag , can be passed to force the string or numeric sorting behavior. In the following example, the PHP constant SORT_STRING sorts the numbers as if they were strings:

24, 'nt'=>19, 'te'=>3, 'sn'=>16, 'fs'=>56, 'et'=>8, 'oso'=>171]; asort($a, SORT_STRING); print_r($a);

The output of the example shows the result:

//Alphabetically sorted Array ( [sn] => 16 [oso] => 171 [nt] => 19 [tf] => 24 [te] => 3 [fs] => 56 [et] => 8 )

ksort Sort arrays by keys in ascending order

ksort( ) sorts the elements in an array from lowest key to highest key (in alphabetic order). The following example demonstrates the ksort( ) function.

 'II','four' => 'IV', 'three' => 'III', 'one' => 'I']; ksort($a); print_r($a); /* Prints Array ( [four] => IV [one] => I [three] => III [two] => II ) */

ksort() function, another example:

"kk", "e"=>"zz", "z"=>"hh", "a"=>"rr"); ksort($map); print_r($map); /* Prints Array ( [a] => rr [e] => zz [o] => kk [z] => hh ) */

krsort Sort arrays by keys in descending order

krsort( ) sorts the elements in the subject array from highest key to lowest key (in reverse alphabetic order). The following example demonstrates the krsort( ) function:

 'II','four' => 'IV', 'three' => 'III', 'one' => 'I']; krsort($a); print_r($a); /* Prints Array ( [two] => II [three] => III [one] => I [four] => IV )

krsort() function, another example:

"kk", "e"=>"zz", "z"=>"hh", "a"=>"rr"); krsort($map); print_r($map); /* Prints Array ( [z] => hh [o] => kk [e] => zz [a] => rr ) */

More Posts on PHP Sorting Arrays:

Читайте также:  Тип float python это

Источник

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