Intereting Posts

PHP сортировать массив в алфавитном порядке, а затем численно?

У меня есть массив.

$test = array("def", "yz", "abc", "jkl", "123", "789", "stu"); 

если я запустил sort() я получаю

 Array ( [0] => 123 [1] => 789 [2] => abc [3] => def [4] => jkl [5] => stu [6] => yz ) 

но я бы хотел его увидеть

 Array ( [0] => abc [1] => def [2] => jkl [3] => stu [4] => yz [5] => 123 [6] => 789 ) 

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

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

 function myComparison($a, $b){ if(is_numeric($a) && !is_numeric($b)) return 1; else if(!is_numeric($a) && is_numeric($b)) return -1; else return ($a < $b) ? -1 : 1; } $test = array("def", "yz", "abc", "jkl", "123", "789", "stu"); usort ( $test , 'myComparison' ); 

Вы можете преобразовать числа в целые числа до сортировки:

 $array = array("def", "yz", "abc", "jkl", "123", "789", "stu"); foreach ($array as $key => $value) { if (ctype_digit($value)) { $array[$key] = intval($value); } } sort($array); print_r($array); 

Вывод:

 Array ( [0] => abc [1] => def [2] => jkl [3] => stu [4] => yz [5] => 123 [6] => 789 ) 

В следующем коде отдельные данные представлены в двух массивах: один – численный, другой – нет, сортировать и объединять.

 $arr1 = $arr2 = array(); $foreach ($arr as $val) { if (is_numeric($val)) {array_push($arr2, $val); } else {array_push($arr1, $val);} } 

поэтому вам нужно отделить массивы с числовыми и нечисловыми

 sort($arr2); sort($arr1); $test = array_merge($arr2,$arr1); 

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

 sort($test); foreach ($test as $index=>$value) { if (is_numeric($value)) { $test[] = $value; unset($test[$index]); } else { continue; } } с sort($test); foreach ($test as $index=>$value) { if (is_numeric($value)) { $test[] = $value; unset($test[$index]); } else { continue; } } 

usort , вероятно, будет быстрее, и он будет делать сравнения один раз, в то время как другие решения, упомянутые до сих пор, могут быть немного медленнее, поскольку они требуют итерации по некоторым или всем массивам до или после сортировки