в основном это должно сортировать от A до Z, затем по числовому порядку, но используя смешанный тип, функция не знает, как отсортировать массив и дать случайный результат ...
на странице руководства естьогромное предупреждение гласит:
Будьте осторожны при сортировке массивов со значениями смешанных типов, потому что sort () может привести к непредсказуемым результатам.
вы можете добавить параметр в функцию:
SORT_REGULAR - сравнивать элементы как обычно (не меняйте типы)
SORT_NUMERIC - сравнивать элементы численно
SORT_STRING - сравнивать элементы в виде строк
SORT_LOCALE_STRING - сравнивать элементы в виде строк на основе текущей локали.Добавленный в PHP 4.4.0 и 5.0.2, он использует системный языковой стандарт, который можно изменить с помощью setlocale ().
В соответствии с руководством здесь на php.net
Редактировать 1: Вероятно, вы можете получить лучший результат сортировки, используя флаг SORT_REGULAR
, поскольку он не меняет тип переменной, а числа остаются числами, а строки остаются строками, но это будеттакже даст вам странный результат
fruits[0] = 121
fruits[1] = Lemon
fruits[2] = apple
fruits[3] = banana
fruits[4] = lemon
fruits[5] = 20
fruits[6] = 40
fruits[7] = 50
Я думаю, потому что он сравнивает код ASCII с буквами строк, а L
до a b l
... 121 на первом месте, потому что вы написали его такстрока "121"
Редактировать 2:
Лучший способ продолжить - разделить типы: (таким образом php будет обрабатывать «121» как число ине строка, но вы можете просто решить это с помощью предложения if
<?php
$fruits = array("lemon","Lemon", 20, "banana", "apple","121",40,50);
$arr1=array();
$arr2=array();
foreach($fruits as $key=>$val){
if (is_numeric($val))
array_push($arr1,$val);
else
array_push($arr2,$val);
}
sort($arr1,SORT_NUMERIC);
sort($arr2,SORT_LOCALE_STRING);
$fruits = array_merge($arr1,$arr2);
echo "<pre>";
foreach ($fruits as $key => $val) {
echo "fruits[" . $key . "] = " . $val . "\n";
}
?>