evg

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

Рассмотрим функции применямые для сортировки массивов в PHP.
С описанием и примерами применения.
bool sort(array &A[,int sort_flags])
+
-
Сортирует массив, распологая элементы в порядке возрастания. При этом изменяет значения ключей на новые.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Параметр sort_flags был добавлен начиная с PHP 4
  • SORT_REGULAR - сравнивать элементы нормально (не изменять типы)
  • SORT_NUMERIC - сравнивать элементы как числа
  • SORT_STRING - сравнивать элементы как строки
  • SORT_LOCALE_STRING - сравнивать элементы как строки, с учетом локали.(Добавлено в PHP 5.0.2)
Эти значения используются во всех функциях где указан параметр sort_flags.
КодРезультат

	<?php
		$da = array(5,7,10,20,1,3,2);
		$sa = array("bs","as","cs","ks");
		
		sort($da); 	//сортируем массив
		reset($da);	//устанавливаем указатель массива на  первый элемент
		sort($sa); 
		reset($sa);
		foreach ($da as $key => $val)
			echo "$da[".$key."] = ".$val."<br>";
		foreach ($sa as $key => $val)
			$ret.= "$sa[".$key."] = ".$val."<br>";
	?>
$da[0] = 1
$da[1] = 2
$da[2] = 3
$da[3] = 5
$da[4] = 7
$da[5] = 10
$da[6] = 20
$sa[0] = as
$sa[1] = bs
$sa[2] = cs
$sa[3] = ks

bool asort(array &A[,int sort_flags])
+
-

Сортирует массив в прямом порядке сохраняя при этом значение пары ключ => значение.
Используется для сортировки ассоциативных массивов.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
КодРезультат

	<?php
		$asort_m = array("b"=>"B", "c"=>"C","a"=>"A");
	
		asort($asort_m); 	//сортируем массив
		reset($asort_m);	//устанавливаем указатель массива на  первый элемент
		
		foreach ($asort_m as $key => $val)
			echo "$da[".$key."] = ".$val."<br>";
	?>
	
$asort_m[a] = A
$asort_m[b] = B
$asort_m[c] = C
"
bool rsort(array &A[,int sort_flags])
+
-

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

	//Тот же что и в функции asort
	$rsort_m = array("4","2","3","1","7","13","15","11");         
	rsort($rsort_m); 	//сортируем массив		
	
$rsort_m[0] = 15
$rsort_m[1] = 13
$rsort_m[2] = 11
$rsort_m[3] = 7
$rsort_m[4] = 4
$rsort_m[5] = 3
$rsort_m[6] = 2
$rsort_m[7] = 1
bool arsort(array &A[,int sort_flags])
+
-

Сортирует массив в обратном порядке, сохраняя при этом соотношения ключ => значение без изменения
Используется для сортировки ассоциативных массивов.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
КодРезультат

		//Тот же что и в функции asort
		$arsort_m = array("a"=>"A", "b"=>"B","c"=>"C");
		arsort($arsort_m); 	//сортируем массив		
	
$arsort_m[c] = C
$arsort_m[b] = B
$arsort_m[a] = A
bool ksort(array &A[,int sort_flags])
+
-

Сортирует массив по ключам, сохраняя соотношение ключ => значение.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
КодРезультат

		//Тот же что и в функции asort
		$ksort_m = array("c"=>"C", "b"=>"B","a"=>"A");
		ksort($ksort_m); 	//сортируем массив	
	
$ksort_m[a] = A
$ksort_m[b] = B
$ksort_m[c] = C
bool krsort(array &A[,int sort_flags])
+
-

Сортирует массив по ключам в обратном порядке, сохраняя соотношение ключ => значение.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
КодРезультат

		//Тот же что и в функции asort
		$krsort_m = array("a"=>"A", "b"=>"B","c"=>"C");
		krsort($krsort_m); 	//сортируем массив		
	
$krsort_m[c] = C
$krsort_m[b] = B
$krsort_m[a] = A
bool natsort(array &A)
+
-

Сортирует массив с использованием алгоритма "natural order", т.е. в порядке привычном для человека. Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
КодРезультат

		//Тот же что и в функции asort
		$natsort_m = array("A4", "b2","a3","B1","A2","a2","b3","B5","A1","A10");
		natsort($natsort_m); 	//сортируем массив		
	
$natsort_m[8] = A1
$natsort_m[4] = A2
$natsort_m[0] = A4
$natsort_m[9] = A10
$natsort_m[3] = B1
$natsort_m[7] = B5
$natsort_m[5] = a2
$natsort_m[2] = a3
$natsort_m[1] = b2
$natsort_m[6] = b3
void natcasesort(array &A)
+
-

Сортирует массив с использованием алгоритма "natural order", т.е. в порядке буквенных и цифровых значений в привычных для человека. Регистронезависимая реализация функции natsort()
КодРезультат

		//Тот же что и в функции asort
		$natcsort_m = array("A4", "b2","a3","B1","a2","b3","B5","A1");
		natcsort($natcsort_m); 	//сортируем массив		
	
$natcsort_m[7] = A1
$natcsort_m[4] = a2
$natcsort_m[2] = a3
$natcsort_m[0] = A4
$natcsort_m[3] = B1
$natcsort_m[1] = b2
$natcsort_m[5] = b3
$natcsort_m[6] = B5
bool array_multisort(array &A[, mixed arg [, mixed ... [, array ...]]])
+
-

Сортирует несколько массивов или один многомерный массив. При этом сохраняя соответствие ключи => значениями. Первый аргумент должен быть массивом, следующие аргументы могут быть как массивами так и значениями определяющими тип и порядок сортировки Порядок сортировки:
  • SORT_ASC - сортировать в возрастающем порядке
  • SORT_DESC - сортировать в убывающем порядке
Тип сортировки:
  • SORT_REGULAR - сравнивать элементы обычным образом
  • SORT_NUMERIC - сравнивать элементы, как если бы они были числами
  • SORT_STRING - сравнивать элементы, как если бы они были строками
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
КодРезультат

	<?php
	$msort1 = array(2,"gg","bb","aa");
	$msort2 = array(2, 5,   6,   40);
	array_multisort($msort1, $msort2); 	//сортируем массив		
	reset($msort1);	//устанавливаем указатель массива на  первый элемент
	reset($msort2);	//устанавливаем указатель массива на  первый элемент

	foreach ($msort1 as $key => $val)
		echo "$msort1[".$key."] = ".$val."<br>";

	foreach ($msort2 as $key => $val)
		echo "$msort2[".$key."] = ".$val."<br>";			
		
	?>
	
$msort1[0] = 2
$msort1[1] = aa
$msort1[2] = bb
$msort1[3] = gg
$msort2[0] = 2
$msort2[1] = 40
$msort2[2] = 6
$msort2[3] = 5
bool usort(array &A,callback comparator)
+
-

Сортирует массив A по значениям используя для сравнения элементов пользовательскую функцию comparator
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Функция должна иметь вид:

	function comparator($a, $b) {
		if ($a меньше $b)
			return отрицательное число (-1);
		if ($a больше $b)
			return положительное число (1);
		return 0;	// при $a равном $b
	}
	
КодРезультат

	<?php
	$usort_m = array(array(7, 8), array(3, 1), array(2,20), array(1, 2));
	function ucmp($a,$b){
		//сортируем по сумме элементов в массивах
		$n = $a[0] + $a[1];
		$v = $b[0] + $b[1];
		if($n < $v) return -1;
		if($n > $v) return  1;
		return 0;
	}
	usort($usort_m,'ucmp'); 	//сортируем массив
	reset($usort_m);	//устанавливаем указатель массива на  первый элемент
	
	foreach ($usort_m as $key => $val)
		echo "$usort_m[".$key."] = array(".$val[0].", ".$val[1].")<br>";
	?>
	
$usort_m[0] = array(1, 2)
$usort_m[1] = array(3, 1)
$usort_m[2] = array(7, 8)
$usort_m[3] = array(2, 20)
bool uasort(array &A,callback comparator)
+
-

Сортирует массив в прямом порядке, используя для сравнения элементов пользовательскую функцию comparator, при этом сохраняет значение пары ключ => значение.
Ипользуется для сортировки ассоциативных массивов.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
КодРезультат

	<?php
	$usort_m = array('a'=>'A','b'=>'B',c=>'C','d'=>'D');
	function uacmp($a,$b){
		//сортировка строк в обратном порядке
		if(strcmp($a, $b) > 0) return -1;
		if(strcmp($a, $b) < 0) return  1;
		return 0;
	}
	uasort($uasort_m,'uacmp'); 	//сортируем массив
	reset($uasort_m);	//устанавливаем указатель массива на  первый элемент
	
	foreach ($uasort_m as $key => $val)
		echo "$uasort_m[".$key."] = ".$val."<br>";
	?>
	
$uasort_m[d] = D
$uasort_m[c] = C
$uasort_m[b] = B
$uasort_m[a] = A
bool uksort(array &A,callback comparator)
+
-

Сортирует массив по ключам, используя для сравнения элементов пользовательскую функцию comparator
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
КодРезультат

	<?php
	$uksort_m = array('d'=>10,'b'=>20,'a'=>30,'c'=>40);
	function ukcmp($a,$b){
		//сортировка строк в прямом порядке
		if(strcmp($a, $b) < 0) return -1;
		if(strcmp($a, $b) > 0) return  1;
		return 0;
	}
	uasort($uksort_m,'ukcmp'); 	//сортируем массив
	reset($uksort_m);	//устанавливаем указатель массива на  первый элемент
	
	foreach ($uksort_m as $key => $val)
		echo "$uksort_m[".$key."] = ".$val."<br>";
	?>
	
$uksort_m[a] = 30
$uksort_m[b] = 20
$uksort_m[c] = 40
$uksort_m[d] = 10

Коментарии