Разница при сортировке массива строк и массива чисел, в php - PullRequest
2 голосов
/ 21 июня 2010

У меня есть два массива в php

$arrNum = array(1.7, 1.52, 0.01, 0.11);

$arrStr = array('1.7', '1.52', '0.01', '0.11');

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

Возможно ли для сортировки или операции max / min возвращать другой результат для второго массива только потому, что они являются строками?

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

Ответы [ 2 ]

7 голосов
/ 21 июня 2010

Документация понятна, IMO:

например. для sort():

Эта функция сортирует массив. Элементы будут расположены от от низшего к высшему , когда эта функция будет завершена.

И для определения того, как обрабатываются значения, требуется параметр:

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

  • SORT_REGULAR - сравнивать элементы как обычно (не меняйте типы) <- это значение по умолчанию </li>
  • SORT_NUMERIC - сравнить элементы численно
  • SORT_STRING - сравнивать элементы как строки
  • SORT_LOCALE_STRING - сравнивать элементы в виде строк на основе текущей локали.

Но у него также есть предупреждение:

Внимание
Будьте осторожны при сортировке массивов со значениями смешанных типов , поскольку sort () может дать непредсказуемые результаты .


Теперь для max():

Примечание: PHP будет оценивать нечисловую строку как 0 по сравнению с целым числом , но все равно возвращает строку, если она рассматривается как числовое наибольшее значение. Если множество аргументов оценивается как 0, max () вернет числовой 0, если он задан, иначе будет возвращено самое высокое строковое значение в алфавитном порядке.

и

Если задана строка , она будет приведена как целое число при сравнении.


Обновление:

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

sort($array, SORT_NUMERIC);
0 голосов
/ 21 июня 2010

Другой ответ очень хорошо охватывает случаи sort () и max ().Для сравнения элементов в php есть два оператора сравнения, которые будут обрабатывать такие вещи, как 1.23 против '1.23' по-разному: === и !==.

См. http://php.net/manual/en/language.operators.comparison.php.

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