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


Здравствуйте интересный вопрос. Когда-то сталкивался с такой задачей тоже… Вот код который вам поможет:

/*  * Сортировка массива по двум параметрам с помощью usort()  */ function _usort_object_by_time_ms($a, $b){ 	// поля по которым сортировать 	$array = array( 'laps'=>'desc', 'time_ms'=>'asc' );  	$res = 0; 	foreach( $array as $k=>$v ){ 		if( $a->$k == $b->$k ) continue;  		$res = ( $a->$k < $b->$k ) ? -1 : 1; 		if( $v=='desc' ) $res= -$res; 		break; 	}  	return $res; }

Здесь в $array нужно указать ваши поля по порядку, какое первое и второе. В значениях asc и desc — это порядок сортировки…

Функция для сортировки массива с объектами

Функция на основе первого примера, с которой удобно работать.

Передаете в $array массив объектов (можно массив массивов), указываете в $args параметры сортировки и получаете отсортированный массив объектов.

## Сортировка объектов/массивов находящихся в массиве, по указанным полям. function sort_nested_arrays( $array, $args = array('votes' => 'desc') ){ 	usort( $array, function( $a, $b ) use ( $args ){ 		$res = 0;  		$a = (object) $a; 		$b = (object) $b;  		foreach( $args as $k => $v ){ 			if( $a->$k == $b->$k ) continue;  			$res = ( $a->$k < $b->$k ) ? -1 : 1; 			if( $v=='desc' ) $res= -$res; 			break; 		}  		return $res; 	} );  	return $array; }

Пример:


$arr = array( 	array( 		'laps' => 25, 		'time_ms' => 3143413, 	), 	array( 		'laps' => 24, 		'time_ms' => 3146280, 	), 	(object) array( 		'laps' => 23, 		'time_ms' => 3149972, 	), 	(object) array( 		'laps' => 25, 		'time_ms' => 3162714, 	), );  $arr = sort_nested_arrays( $arr, array('laps' => 'desc') );  print_r( $arr );  /* Получим: Array ( 	[0] => Array 		( 			[laps] => 25 			[time_ms] => 3143413 		)  	[1] => stdClass Object 		( 			[laps] => 25 			[time_ms] => 3162714 		)  	[2] => Array 		( 			[laps] => 24 			[time_ms] => 3146280 		)  	[3] => stdClass Object 		( 			[laps] => 23 			[time_ms] => 3149972 		)  ) */

Еще одни пример сортировки по нескольким полям

Допустим у нас есть массив:

Array ( 	[0] => 10В 	[1] => 5Б 	[2] => 9А 	[3] => 11А 	[4] => 10А 	[5] => 5А 	[6] => 10Г 	[7] => 9Б )

Нам нужно отсортировать его, сначала по числу в строке, а затем по букве. Делаем так:

// сортируем по порядку: числа, потом буквы usort( $val, function($a,$b){ 	$res = 0;  	// сравниваем числа 	$inta=intval($a); $intb=intval($b); 	if( $inta != $intb ){ 		return ( $inta > $intb ) ? 1 : -1; 	}  	// сравниваем буквы 	$var1 = preg_replace('~[0-9]+~', '', $a); 	$var2 = preg_replace('~[0-9]+~', '', $b); 	$compare = strcmp( $var1, $var2 ); // А считается меньше Б 	if( $compare !== 0 ){ 		return ( $compare > 0 ) ? 1 : -1; 	}  	return $res; } );

Получим:


Array ( 	[0] => 5А 	[1] => 5Б 	[2] => 9А 	[3] => 9Б 	[4] => 10А 	[5] => 10В 	[6] => 10Г 	[7] => 11А )

wp-kama.ru

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

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

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

Пример:

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

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

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


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

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

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

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

Пример:

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

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

www.internet-technologies.ru

Сортирование индексированных массивов: 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 ( [0] => Alfred Hitchcock [1] => Rear Window [2] => 112 [3] => 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 ( [director] => Alfred Hitchcock [title] => Rear Window [minutes] => 112 [year] => 1954 )" print_r( $movie ); 

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


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

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

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

 $movie = array( "title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112 ); // Отображает "Array ( [director] => Alfred Hitchcock [minutes] => 112 [title] => Rear Window [year] => 1954 )" ksort( $movie ); print_r( $movie ); // Отображает "Array ( [year] => 1954 [title] => Rear Window [minutes] => 112 [director] => 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 "<br />"; print_r( $titles ); echo "<br />"; print_r( $years ); echo "<br />"; 

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

Array ( [0] => Alfred Hitchcock [1] => Martin Scorsese [2] => Stanley Kubrick )
Array ( [0] => Rear Window [1] => Mean Streets [2] => Full Metal Jacket )
Array ( [0] => 1954 [1] => 1973 [2] => 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 ( [0] => Alfred Hitchcock [1] => Martin Scorsese [2] => Stanley Kubrick [3] => Stanley Kubrick )
Array ( [0] => Rear Window [1] => Mean Streets [2] => A Clockwork Orange [3] => Full Metal Jacket )
Array ( [0] => 1954 [1] => 1973 [2] => 1971 [3] => 1987 )

naikom.ru

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(), сортирует массив, используя пользовательскую функцию для сравнения элементов и сохранением ключей.

В примере сортировка идет по ключу «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.  

( 'sku' => '7543', 'count' => '2' ) ); $array = array_multisort_value($array, 'count', SORT_DESC); print_r($array);

snipp.ru

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

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

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

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

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

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

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

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

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

Плюсы:

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

Пробуем костыли

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

Засекаем. Получаем: 7.90 сек. Ну уже не плохо впринципе.

Да вот только заставить этот костыль сортировать по двум ключам уже не получится, к сожалению. Подведем итоги. Минусы:

  • Невозможно расширять
  • Сортировка только по одному ключу

Плюсы

  • Приемлимая скорость выполнения
  • Одна функция для разных видов сортировки

Функция array_multisort

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

Выведет:

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

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

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

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

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

Минусы

  • ??

Плюсы

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

Заключение

Вообщем используйте array_multisort для сортировки многомерных массивов. И будет вам счастье.

Спасибо за внимание =)

intsystem.org

Функция sort(); — Сортировка массива по возрастанию и по алфавиту

Структура:

sort( $Массив, $Флаг );

Функция сортирует заданный ей массив $Массив по возрастанию. Функция предназначена для работы со списками. Списки это обычные массивы, ключи которых начинаются с нуля. Функции можно задать необязательный аргумент $Флаг, который манипулирует тем как именно должно происходить сортировка. Рассмотрим описание аргумента $Флаг:

SORT_REGULAR – Сортировка по умолчанию работы функции

SORT_NUMERIC — Сортировка чисел, по возрастанию

SORT_STRING — Сортировка строк, по алфавиту

Рассмотрим пример, у нас есть массив где хранятся в хаотичном виде данные о количестве пар студента в разные года учебы.

<?php $Leasons = array(83, 100, 72); sort($Leasons); foreach($Leasons as $num) { 	$palce++; 	echo "Курс: {$palce} - {$num} пар<br />"; } ?>

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

Курс: 1 - 72 пар Курс: 2 - 83 пар Курс: 3 - 100 пар

Если бы мы не применили функцию sort(); результат работы был бы следующим:

Курс: 1 - 83 пар Курс: 2 - 100 пар Курс: 3 - 72 пар

Сортировка по алфавиту

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

<?php $Country = array("Россия", "Италия", "Япония", "Армения"); sort($Country); foreach($Country as $name) { 	echo "{$name}<br />"; } ?>

Результат работы:

Армения Италия Россия Япония

live-code.ru

Я использовал оба решения и AJ Quick и придумал функцию, которая может помочь в этой проблеме для многих случаев, например, для сортировки или сохранения ключей ASC или DESC или если у вас есть объекты в виде дочерних элементов массива .

Вот эта функция:

/**  * @param array $array  * @param string $value  * @param bool $asc - ASC (true) or DESC (false) sorting  * @param bool $preserveKeys  * @return array  * */ function sortBySubValue($array, $value, $asc = true, $preserveKeys = false) {  if ($preserveKeys) {  $c = array();  if (is_object(reset($array))) {  foreach ($array as $k => $v) {  $b[$k] = strtolower($v->$value);  }  } else {  foreach ($array as $k => $v) {  $b[$k] = strtolower($v[$value]);  }  }  $asc ? asort($b) : arsort($b);  foreach ($b as $k => $v) {  $c[$k] = $array[$k];  }  $array = $c;  } else {  if (is_object(reset($array))) {  usort($array, function ($a, $b) use ($value, $asc) {  return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1);  });  } else {  usort($array, function ($a, $b) use ($value, $asc) {  return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1);  });  }  }   return $array; } 

Применение:

sortBySubValue($array, 'optionNumber', true, false); 

редактировать

Первая часть может быть переписана с использованием uasort() и функция будет короче:

/**  * @param array $array  * @param string $value  * @param bool $asc - ASC (true) or DESC (false) sorting  * @param bool $preserveKeys  * @return array  * */ function sortBySubValue($array, $value, $asc = true, $preserveKeys = false) {  if (is_object(reset($array))) {  $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {  return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1);  }) : usort($array, function ($a, $b) use ($value, $asc) {  return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1);  });  } else {  $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {  return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1);  }) : usort($array, function ($a, $b) use ($value, $asc) {  return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1);  });  }  return $array; } 

code-examples.net

Мы можем использовать несколько разных методов для этого. Один из способов использования функции usort().

Другой способ — просто определить значения и создать другой массив со значениями, а затем использовать его в функции array_multisort() .

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

1.Сортировка с использованием usort.

Первый способ сортировки массива — использование функции usort(). Вот код, который мы можем использовать для выполнения этого вида:

Функция usort() сортирует $array с помощью функции сравнения (cmp), которую мы создали. Вышеприведенный код может использоваться для сортировки многомерного массива на основе значения столбца имен массива. Это простой способ сортировки многомерного массива на основе значения одного ключа.

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

2.Сортировка с использованием array_multisort по значения 1-го ключа.

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

3.Сортировка с использованием array_multisort по значению 2-х ключей.

Теперь давайте посмотрим, как мы можем сортировать один и тот же массив с помощью значений 2-х ключей массива. В этом примере мы будем сортировать по значению по возрастанию, по убыванию имени.

Этот код сначала сортирует $array_values восходящий, $array_name нисходящий, а затем $array использует оба сортированных массива. Используя этот метод, мы можем сортировать многомерный массив в зависимости от значений нескольких разных ключей.

4.Сортировка с использованием array_multisort по значению с 3-я ключами

Теперь давайте посмотрим, как мы можем сортировать один и тот же массив по 3-я ключами. В этом примере мы будем сортировать по убыванию, по убыванию и имени по возрастанию.

Этот код сначала сортирует $array_values нисходящий, $array_order нисходящий, $array_name восходящий, а затем $array использует эти отсортированные массивы. Используя этот метод, мы можем сортировать многомерный массив в зависимости от значений нескольких разных ключей. Этот метод может быть расширен для сортировки массива по любому числу значений.

world-hello.ru


You May Also Like

About the Author: admind

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.