Изучаем php: сортировка массива

Введение в сортировку массивов в PHP

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

<?php
$spisokTsvetov = array(
  "apple"  => "red",
  "grass"  => "green",
  "sky"    => "blue",
  "night"  => "black",
  "wall"   => "white"
);
?>

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

<?php
foreach ($spisokTsvetov as $key => $value) {
  echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>

Результат будет следующим:

apple - red
grass - green
sky - blue
night - black
wall - white

Теперь перейдем к процессу сортировки этого массива.

Using an ‘anonymous’ function

This is where it starts to get interesting. You can create an
anonymous function based on information gathered at run time.
This allows for greater flexibility, without too much extra coding.

The call can then be shortened to:

Finally, you can wrap it all into a single function as shown below.
Now the code’s starting to look more ‘readable’ which is a good
sign:

index firstname lastname age
Patricia Williams 7
Amanda Miller 18
Sarah Miller 24
Mary Johnson 25
Patrick Miller 27
James Brown 31
Michael Davis 43

We now have a simple generic function that can be used to sort any
associative array on a single scalar attribute.

Основные функции сортировки массива в PHP

Для сортировки массива в PHP вы можете использовать встроенные функции и . Разница между ними заключается в том, что сортирует массив в обратном порядке (по убыванию), а – в обычном порядке (по возрастанию).

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

<?php
sort($spisokTsvetov);
foreach ($spisokTsvetov as $key => $value) {
  echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>

Результат будет следующим:

0 - black
1 - blue
2 - green
3 - red
4 - white

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

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

<?php
rsort($spisokTsvetov);
foreach ($spisokTsvetov as $key => $value) {
  echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>

И результат будет следующий:

0 - white
1 - red
2 - green
3 - blue
4 - black

Теперь давайте узнаем, как решить проблему с потерей ключей, что важно, если вы используете ассоциативные массивы

Сортировка ассоциативных массивов в PHP

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

<?php
asort($spisokTsvetov);
foreach ($spisokTsvetov as $key => $value) {
  echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>

Результат будет следующим:

night - black
sky - blue
grass - green
apple - red
wall - white

Теперь результат выглядит намного лучше. Чтобы получить сортировку в обратном порядке, просто используйте функцию вместо .

Но что делать, если вы хотите отсортировать ассоциированные массивы на основе ключей? Нет проблем, давайте посмотрим как это сделать.

Как сортировать массив по ключу в PHP

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

<?php
ksort($spisokTsvetov);
foreach ($spisokTsvetov as $key => $value) {
  echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>

Результат будет следующим:

apple - red
grass - green
night - black
sky - blue
wall - white

Использовать функцию довольно просто.

Помимо рассмотренных функций в PHP есть и другие, более сложные функции сортировки:

  • – сортировка нескольких или многомерных массивов.
  • – сортировка массива с использованием нечувствительного к регистру алгоритма «естественного порядка»
  • – сортировка массива с использованием алгоритма «естественного порядка».
  • – сортирует массив с помощью пользовательской функции сравнения и поддерживает связь с индексами.
  • – сортирует массив по ключам, используя пользовательскую функцию сравнения
  • – сортирует массив по значениям, используя пользовательскую функцию сравнения

Бонусный навык: поиск в массиве с помощью PHP

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

Массив рассмотрим тот же (что в самом начале статьи).

Теперь, если вы хотите узнать, существует ли значение , вы можете использовать встроенную в PHP функцию . Ниже пример ее использования:

<?php
echo 'Blue is ' . array_search("blue", $spisokTsvetov);
?>

В результате вы получите следующее значение:

Blue is sky

На сегодня все, спасибо, что читаете нас!

  • 1263

  • 68

  • Опубликовано 09/12/2019

  • PHP, Уроки программирования

Sorting on multiple fields

If you want to sort by lastname AND firstname, then you might think
that just applying two sorts in sequence would give you the desired
result:

Note that here we’ve specifed the current namespace
__NAMESPACE__ to make the code compatible with PHP namespaces. Otherwise any
function you pass has to exist in the global namespace.

You might think so, but since PHP version 4.1 the usort and
related functions will essentially shuffle the array before sorting (the
algorithm is ‘no longer stable’):

See our Quick Sort Algorithm
article for more detail.

This means that, after ordering by first name, the result of then
sorting
by last name will not necessarily retain the correct
order of first names.

So what’s the solution? We need a new function that can compare both
fields at the same time and then apply the sort:

Finally, the result we wanted:

index firstname lastname age
James Brown 31
Michael Davis 43
Mary Johnson 25
Amanda Miller 18
Patrick Miller 27
Sarah Miller 24
Patricia Williams 7

This function works because it first compares the last names, and
only if they are identical will it compare the first names to work out
the correct order.

You can extend this function to use more variables by inserting more
conditions every time $retval has a zero value.

Классическое решение

Естественно первое про что вы подумали, это сортировка многомерного массива с помощью uasort, да? Набросаем вот такой вот код:

function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
for($i=0; $i<100000; $i++){
$data_tmp=$data;
uasort($data_tmp, ‘cmp’);
}

1
2
3
4
5
6
7
8
9
10

functioncmp($a,$b){

if($a’year’==$b’year’){

return;

}

return($a’year'<$b’year’)?-11;

}

for($i=;$i<100000;$i++){

$data_tmp=$data;

uasort($data_tmp,’cmp’);

}

Запускаем, и засекаем время выполнения… Итого: 13.15 сек. Долговато и не впечатляет.

Ищем пути решения проблемы, находим на php.net, другой вариант функции сравнения, который, как там написано, должен работать быстрее:

function cmp($a, $b) {
return strcmp($a, $b);
}
for($i=0; $i<100000; $i++){
$data_tmp=$data;
uasort($data_tmp, ‘cmp’);
}

1
2
3
4
5
6
7

functioncmp($a,$b){

returnstrcmp($a’year’,$b’year’);

}

for($i=;$i<100000;$i++){

$data_tmp=$data;

uasort($data_tmp,’cmp’);

}

Итого: 23.11 сек. Хреновая оптимизация…

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

function cmp($a, $b) {
if ($a == $b) {
if ($a == $b){
return 0;
}else{
return ($a < $b) ? -1 : 1;
}
}else{
return ($a < $b) ? -1 : 1;
}
}

1
2
3
4
5
6
7
8
9
10
11

functioncmp($a,$b){

if($a’year’==$b’year’){

if($a’author’==$b’author’){

return;

}else{

return($a’author'<$b’author’)?-11;

}

}else{

return($a’year'<$b’year’)?-11;

}

}

Громоздко. Сложно изменять. Вообщем отстой, на мой взгляд.

Итак, подведем итоги. Минусы:

  • Долго выполняется
  • Сложно расширять
  • Под каждую сортировку нужна своя, новая функция

Плюсы:

Единственный очевидный вариант (?)

Свои способы сортировки

Если предложенные способы сортировки вам не подходят, то можно создать свой способ сортировки ключей и значений массивов.
Для этого есть 3 функции uasort, uksort и usort.
С их помощью мы можем задать свою callback функцию, которая будет сравнивать элементы между собой и определять какой из них «больше» и какой «меньше».

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

Принцип работы следующий, мы создаем callback функцию сравнения по какому-то необычному признаку. Она должна сравнивать элементы и возвращать одно из трех значений: -1, 0 или 1

Давайте рассмотрим как они работают напримере функции uasort, которая сравнивает значения с сохранением ключей.

// Наша функция сравнения
$callbackCmpFunction = function cmp($a, $b) {
    if ($a == $b) { // если 2 значения массива равны
        return 0; // вернем 0
    }
    return ($a < $b) ? -1 : 1; 
}
  • -1 — возвращается, когда элемент, который слева больше правого
  • 0 — когда элементы равны
  • 1 — когда правый больше левого

Применить нашу новую функцию можно так:

// Сортируемый массив
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);

// Сортируем и выводим получившийся массив
uasort($array, $callbackCmpFunction); // вторым параметром указываем нашу callback функцию
print_r($array);

Сохранение ключей означает, что каждый ключ как бы привязан к своему значению.

Функции без сохранения ключей sort и rsort, сбрасывают ключи и они начинают идти по порядку (0, 1, 2, …)

Иногда бывает полезно одно, иногда — другое. В зависимости от задачи.

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

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

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя «естественный порядок», например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра. Пример: sort($arr, SORT_NATURAL | SORT_FLAG_CASE)

Флаг сортировки передается в функцию сортировки, например так:

sort($arr, SORT_STRING); 

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 '<h2>Массив в виде</h2><pre>' . print_r($students, 1) . '</pre>';
// Сортировать по оценке (grade):
 uasort($students, 'grade_sort');
echo '<h2>Массив отсортирован по оценке</h2><pre>' . print_r($students, 1) . '</pre>';

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

function grade_sort($x, $y) {
    static $count = 1;
    echo “<p>Iteration $count: {$x} vs. {$y} </p> n”;
    $count++;
    if ($x < $y) {
    return true;
    } else if ($x > $y) {
    return false;
    } else {
    return 0;
    }
}

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

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

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

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

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

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

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

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

Пример:

// Вывести на печать массив в виде (начальный массив):
echo '<h2>Массив в виде</h2><pre>' . print_r($students, 1) . '</pre>';
// Сортировка по имени:
 uasort($students, 'name_sort');
echo '<h2>Массив отсортирован по имени</h2><pre>' . print_r($students, 1) . '</pre>';

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

Пожалуйста, оставьте ваши отзывы по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, отклики, дизлайки, лайки, подписки!

ОСОльга Сайфудиноваавтор статьи «Sorting multi-dimensional array in PHP»

PHP usort() function examples

Let’s take some examples of using the function.

1) Using the PHP usort() function to sort an array of numbers

The following example illustrates how to use the function to sort an array of numbers:

Output:

How it works.

  • First, define an array of three numbers 2, 1, and 3.
  • Second, use the function to sort the array. The callback function returns 0 if two numbers are equal, -1 if the first number is less than the second one, and 1 if the first number is greater than the second one.

To sort the elements of the array in descending order, you just need to change the logic in the comparison function like this:

If you use PHP 7 or newer, you can use the spaceship operator () to make the code more concise:

The spaceship operator compares two expressions and returns -1, 0, or 1 when is respectively less than, equal to, or greater than . For example:

If the callback is simple, you can use an arrow function like this:

Note that PHP introduced the arrow functions since PHP 7.4.

2) Using the PHP usort() function to sort an array of strings by length

The following example uses the function to sort an array of names by length:

Output:

3) Using the PHP usort() function to sort an array of objects

The following example uses the function to sort an array of objects by the property.

Output:

How it works.

  • First, define a class that has two properties: and .
  • Second, define the array that holds the objects.
  • Third, use the function to sort the objects of the array. The function uses a comparison function that compares the age of two objects.

If you want to sort the objects by name, you can compare the in the comparison like this:

Using a static method as a callback

The following example uses a static method of class as a callback for the function:

In this example, we define the class that contains the static method.

The static method compares two objects by age using the spaceship operator.

To use the static method of the class as the callback the function, you pass an array that contains two elements:

The first element is the class name and the second one is the static method.

Сортировка сложных и многомерных массивов с 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 "<br />"; print_r( $titles ); echo "<br />"; print_r( $years ); echo "<br />"; 

Этот код отобразит: 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 "<br />"; print_r( $titles ); echo "<br />"; print_r( $years ); echo "<br />"; 

Этот код выдаёт следующее — заметьте, что «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 )

How to Sort a String in PHP

Method 1 : Convert String into an Array and Perform Sorting

In this example, we first convert a string into an array. After that, we sort the array and implode them to make a string.

Java

/* Unsorted string needs to be sorted. */
$str = ‘qwertyuioplkjhgfdsazxcvbnm’;
/* Using str_split convert them into array. */
$sort = str_split($str);
/* Sort the array using sort() method. */
sort($sort);
/* Implode the sorted array. */
$sort = implode($sort);
/* Output will be sorted string.
abcdefghijklmnopqrstuvwxyz */
echo $sort;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

/* Unsorted string needs to be sorted. */
 

$str=’qwertyuioplkjhgfdsazxcvbnm’;

 
/* Using str_split convert them into array. */
 

$sort=str_split($str);

 
/* Sort the array using sort() method. */
 

sort($sort);

 
/* Implode the sorted array. */
 

$sort=implode($sort);

 
/* Output will be sorted string.
   abcdefghijklmnopqrstuvwxyz */
 

echo$sort;

Programming Video Tutorials

Method 2 : Swap the Position of a String

In this example, We use recursive approach to sort a string using swapping the position of a character.

Java

/* Create a function and take three arguments
@str string needs to be sorted
@len length of the string
@currpos current position, initially it is zero
*/
function sortStr(&$str, $len, $currpos=0) {
if($currpos == $len) return;
/* Initialize next var */
$next = $currpos + 1;
while($next < $len){
/* Logic of swapping the position of character. */
if($str < $str){
$temp = $str;
$str = $str;
$str = $temp;
}
$next++;
}
/* Recursively call sortStr method, with increment currpos. */
sortStr($str, $len, $currpos+1);
}
$str = ‘jhjabcdewyxdef’;
sortStr($str,strlen($str));
/* Output : abcddeefhjjwxy */
echo $str;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

/* Create a function and take three arguments
 
   @str string needs to be sorted
   @len length of the string
   @currpos current position, initially it is zero
 
*/
 

functionsortStr(&$str,$len,$currpos=){

if($currpos==$len)return;

/* Initialize next var */

$next=$currpos+1;

while($next<$len){

/* Logic of swapping the position of character. */

if($str$next<$str$currpos){

$temp=$str$next;

$str$next=$str$currpos;

$str$currpos=$temp;

}

$next++;

}

/* Recursively call sortStr method, with increment currpos. */

sortStr($str,$len,$currpos+1);

}
 

$str=’jhjabcdewyxdef’;

sortStr($str,strlen($str));

 
/* Output : abcddeefhjjwxy */
 

echo$str;

Method 3: Sort string using QuickSort Algorithm

In this method we use QuickSort algorithm to sort a string in-place.

Java

function sortStr($str) {
$left = $right = »;
/* Calculation length. */
$len = strlen($str)-1 ;
/* if length is less than or equal to zero. */
if ($len <= 0) return $str;
/* Let’s take middle element as pivot. */
$pivot = floor($len/2);
do {
if ($len == $pivot) continue;
if ($str <= $str) {
$left .= $str;
} else {
$right .= $str;
}
} while (—$len);
return sortStr($left).$str.sortStr($right);
}
$a = sortStr(‘jhjabcdewyxdef’);
echo $a;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

functionsortStr($str){

$left=$right=»;

/* Calculation length. */

$len=strlen($str)-1;

/* if length is less than or equal to zero. */

if($len<=)return$str;

/* Let’s take middle element as pivot. */

$pivot=floor($len2);

do{

if($len==$pivot)continue;

if($str$len<=$str$pivot){

$left.=$str$len;

}else{

$right.=$str$len;

}

}while(—$len);

returnsortStr($left).$str$pivot.sortStr($right);

}
 

$a=sortStr(‘jhjabcdewyxdef’);

echo$a;

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

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

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

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

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

В конце мы просто перебираем основной массив и выводим информацию о каждом здании.

Сортировка ассоциативных массивов: 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 ); 

Introduction to the PHP usort() function

So far, you learned how to sort an array using a built-in comparison operator.

For example, when you use the function to sort an array of numbers, PHP uses the built-in comparison operator to compare the numbers.

To specify a custom comparison function for sorting, you use the function:

The function has two parameters:

  • is the input array.
  • is the custom comparison function.

The function returns on success or or failure.

The has the following syntax:

The function has two parameters which are the array elements to compare.

The function compares two elements ( and ) and returns an integer value:

  • zero (0) means is equal to .
  • a negative number means is before .
  • a positive number means is after .

Подробно о сортировке массивов:

Для того, чтобы проверить работу «asort» — сортировка массива по значению ячеек массива, нам понадобится:
Массив, который будем сортировать по значению ячейки массива:
$users = ;
Выведем его прямо здесь с помощью print_r:
print_r $users;
Результат:
Array
=> Tom
=> Bob
=> Sam
=> Alice

Теперь применим asort:
asort($users);
Результат сортировки asort($users);:

Array
=> Alice
=> Bob
=> Sam
=> Tom

Обращаю ваше внимание!
Посмотрите на ключи массива — выше… как видим, нумерация ячеек отсортированного(«asort») массива сохранилась!

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

что мы использовали выш :

Массив, который будем сортировать, но уже… по значению ячейки массива в обратную сторону:
$users = ;
Выведем его прямо здесь с помощью print_r:
print_r $users;
Результат:
Array
=> Tom
=> Bob
=> Sam
=> Alice

Применим arsort к массиву:
arsort($users);
Результат сортировки массива по ключу в обратную сторону:

Array
=> Tom
=> Sam
=> Bob
=> Alice

Для того, чтобы отсортировать массив по ключам в ассоциативном массиве, анм понадобится этот ассоциативный массив :
Здесь мы наблюдаем массив, ключи которого не отсортированы…
$states = ;
Выведем, опять данный массив , на экран с помощью print_r:
print_r $states ;
Результат:
Array
=> Madrid
=> Paris
=> Berlin

Применим ksort к нашему массиву:
ksort($states);

Array
=> Paris
=> Berlin
=> Madrid

Предположим, что у Вас есть массив, в котором отличаются лишь детали в значении ячеек массива, например вот такой массив;

$os = array(«Windows 7», «Windows 8», «Windows 10»);
Если мы применим к данному массиву «asort»:
asort($os);
То мы… естественно не увидим ту сортировку, которую бы хотели увидеть, а именно отсортированного было бы по значению рядом со словом в ключе, т.е. по его числовому значению:
Array
=> Windows 10
=> Windows 7
=> Windows 8

Поэтому нам нужна, так называемая — «естественная сортировка» — natsort :
natsort($os);

Array
=> Windows 7
=> Windows 8
=> Windows 10

И о сортировке одномерного массива, такого например как:
$num = ;
Выведем на экран:
Array
=> 2
=> 5
=> 1
=> 4
=> 3

Два примера сортировки одномерного массива от меньшего значения к большем:
asort($num);
Array
=> 1
=> 2
=> 3
=> 4
=> 5

sort($num);
Array
=> 1
=> 2
=> 3
=> 4
=> 5

Два примера сортировки одномерного массива от большего значения к меньшему:
arsort($num);
Array
=> 5
=> 4
=> 3
=> 2
=> 1

rsort($num);
Array
=> 5
=> 4
=> 3
=> 2
=> 1

Пользуйтесь на здоровье! Не забудьте сказать

Теги :php сортировка массиваphp сортировка массива по значениюphp сортировка массива по ключусортировка массива php по полюсортировка массива по алфавиту phpphp сортировка многомерного массива по значениюphp сортировка массива по значению полясортировка двумерного массива phpсортировка элементов массива phpсортировка массива по возрастанию phpфункция php сортировка массиваphp сортировка массива датсортировка массива по убыванию php

Функция array_multisort

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

//Сортируемый масив
$array_main=array(
‘foo’,
‘bar’,
‘foobar’,
);

//Определяющий массив
$array_id=array(
3,
1,
2,
);

array_multisort($array_id, $array_main);

var_dump($array_main);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

//Сортируемый масив

$array_main=array(

‘foo’,

‘bar’,

‘foobar’,

);

 
//Определяющий массив

$array_id=array(

3,

1,

2,

);

array_multisort($array_id,$array_main);

var_dump($array_main);

Выведет:

array(4) {
=> string(3) «bar»
=> string(3) «foobar»
=> string(3) «foo»
}

1
2
3
4
5

array(4){

=>string(3)»bar»

1=>string(3)»foobar»

2=>string(3)»foo»

}

А это как раз то что нам надо! Возвращаемся к тестам на скорость:

$data_year=array();
//Генерируем «определяющий» массив
foreach($data as $key=>$arr){
$data_year=$arr;
}

for($i=0; $i<100000; $i++){
$data_tmp=$data;
array_multisort($data_year, SORT_NUMERIC, $data_tmp);
}

1
2
3
4
5
6
7
8
9
10

$data_year=array();

//Генерируем «определяющий» массив

foreach($data as$key=>$arr){

$data_year$key=$arr’year’;

}
 

for($i=;$i<100000;$i++){

$data_tmp=$data;

array_multisort($data_year,SORT_NUMERIC,$data_tmp);

}

Засекаем. Получаем: 3.87 сек. Это рекорд!

Ну то что это самый быстрый вариант мы определили. Это хорошо. А как насчет расширяемости? Как к примеру заставить сортировать массив по двум ключам? Оказывается с этой функцией очень просто! Достаточно добавить еще один «определяющий массив», вот так:

$data_author=array();
foreach($data as $key=>$arr){
$data_author=$arr;
}

$data_year=array();
foreach($data as $key=>$arr){
$data_year=$arr;
}

array_multisort($data_year, SORT_NUMERIC, $data_author, $data);
var_export($data);

1
2
3
4
5
6
7
8
9
10
11
12

$data_author=array();

foreach($data as$key=>$arr){

$data_author$key=$arr’author’;

}
 

$data_year=array();

foreach($data as$key=>$arr){

$data_year$key=$arr’year’;

}
 

array_multisort($data_year,SORT_NUMERIC,$data_author,$data);

var_export($data);

На выходе получим вот такой массив:

array(
0 => array(‘text’ => ‘str3’, ‘year’ => ‘2009’, ‘author’ => 20, ),
1 => array(‘text’ => ‘str8’, ‘year’ => ‘2009’, ‘author’ => 20, ),
2 => array(‘text’ => ‘str1’, ‘year’ => ‘2010’, ‘author’ => 10, ),
3 => array(‘text’ => ‘str5’, ‘year’ => ‘2010’, ‘author’ => 20, ),
4 => array(‘text’ => ‘str4’, ‘year’ => ‘2010’, ‘author’ => 30, ),
5 => array(‘text’ => ‘str2’, ‘year’ => ‘2011’, ‘author’ => 10, ),
6 => array(‘text’ => ‘str6’, ‘year’ => ‘2011’, ‘author’ => 10, ),
7 => array(‘text’ => ‘str7’, ‘year’ => ‘2011’, ‘author’ => 20, ),
);

1
2
3
4
5
6
7
8
9
10

array(

=>array(‘text’=>’str3′,’year’=>’2009’,’author’=>20,),

1=>array(‘text’=>’str8′,’year’=>’2009’,’author’=>20,),

2=>array(‘text’=>’str1′,’year’=>’2010’,’author’=>10,),

3=>array(‘text’=>’str5′,’year’=>’2010’,’author’=>20,),

4=>array(‘text’=>’str4′,’year’=>’2010’,’author’=>30,),

5=>array(‘text’=>’str2′,’year’=>’2011’,’author’=>10,),

6=>array(‘text’=>’str6′,’year’=>’2011’,’author’=>10,),

7=>array(‘text’=>’str7′,’year’=>’2011’,’author’=>20,),

);

Как видите функция справилась со своей задачей. Наш массив отсортирован сначала по year, затем по author. А с помощью различных флагов типа SORT_DESC, SORT_ASC и тд можно добится любой сортировки (про них подробнее смотрите в мане), так что это на мой взгляд самый лучший вариант для использования в своих скриптах.

Минусы

??

Плюсы

  • Лучшая скорость
  • Расширяемость
  • Функциональность

Sorting based on a list of values

There are situations where it’s not possible to use a numeric or
alphabet-based sort routine. Suppose that you have the following
data to present on a website:

index name position
Mary Johnson Secretary
Amanda Miller Member
James Brown Member
Patricia Williams Member
Michael Davis President
Sarah Miller Vice-President
Patrick Miller Member

And that you want to sort these names by their position, based on the
following list:

Again, it’s not as difficult as you might think. All we need is the
following custom function:

If you don’t have a second field that you want to sort by, just
replace the highlighted line with return 0;

All we’re doing here is looking at the values in the
position field. If they’re identical then we sort by the
name field instead. Otherwise we do a comparison of where in
the sortorder list the relevant values appear and sort based on
that. The output is as follows:

index name position
Michael Davis President
Sarah Miller Vice-President
Mary Johnson Secretary
Amanda Miller Member
James Brown Member
Patricia Williams Member
Patrick Miller Member

As detailed above for simpler cases we can now enhance this function
to make it more generic and re-usable, but I’ll leave that as an
exercise for you. You would need pass the sortorder array to
the function along with details of which fields to sort by.

If you’re working on the web with this type of data, you might also
want to read the article Formatting Data as
HTML which presents instructions for converting PHP data to HTML
tables, lists and forms.

Sorting on a single field

Sorting associative arrays is really quite simple — IF you know
beforehand which field you want to sort by. For example, to sort by
lastname you can use the usort (user-defined search) function:

The output is as follows:

index firstname lastname age
James Brown 31
Michael Davis 43
Mary Johnson 25
Amanda Miller 18
Sarah Miller 24
Patrick Miller 27
Patricia Williams 7

To sort by different fields just replace the
compare_lastname function with a function that orders by
firstname (see below), by age, or any other field in
the associative array. The strnatcmp («natural
order» string comparison) function is handy here as it can be
applied to numbers as well as strings.

Below we will explore using a single function to sort by different
fields by specifying the sort field in the function call. The
comparison function can also be generated on the fly as an anonymous
function.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector