Что такое код strnatcasecmp


Функция PHP strnatcasecmp ()

примеров

Используя «естественный» алгоритм для сравнения двух строк (чувствительно к регистру):

Определение и использование

Функция strnatcasecmp () использует «естественный» алгоритм для сравнения двух строк (чувствительно к регистру).

Естественный алгоритм, число меньше, чем число 10. В компьютерном заказе, 10 меньше, чем 2, поскольку 10 является первым числом менее чем за 2.

Примечание: strnatcasecmp () является не чувствительны к регистру.

грамматика

参数 描述
string1 必需。规定要比较的第一个字符串。
string2 必需。规定要比较的第二个字符串。

технические детали

Возвращает: Эта функция возвращает:
  • 0 — если две строки равны
  • 0 — если string1 больше строке2
Версия PHP: 4 +

Другие примеры

Пример 1

Природа алгоритм (strnatcmp) и регулярные сортировочные компьютерные алгоритмы строка (STRCMP) различны:

Почему пробелы игнорируются в natsort / strnatcmp / strnatcasecmp?

Я использую strnatcmp в моей функции сравнения для сортировки имен людей в таблице. Для нашего бельгийского клиента мы получаем странные результаты. У них есть такие имена, как «Ван дер Брук» и «Вандер Вир», и strnatcasecmp(«Van der», «Vander») возвращает 0 !

поскольку естественное сравнение направлено на сортировку, как человек, я не понимаю, почему пространства полностью игнорируются.

но человека скажи:

теперь мое решение-заменить все пробелы символами подчеркивания, которые обрабатываются правильно. Два вопроса: Почему natsort работать? Есть ли лучшее решение?

3 ответов

Если вы посмотрите в исходном коде, вы можете увидеть это, что, безусловно, выглядит как баг: http://gcov.php.net/PHP_5_3/lcov_html/ext/standard/strnatcmp.c.gcov.php (прокрутите вниз до строки 130):

обратите внимание, что это ссылка на 5.3, но тот же код все еще существует в 5.5 (http://gcov.php.net/PHP_5_5/lcov_html/ext/standard/strnatcmp.c.gcov.php) По общему признанию, мои знания о C ограничены, но это в основном, похоже, продвигает указатель на каждая строка, если текущий символ является пробелом, по существу игнорирует этот символ в сортировке. Комментарий подразумевает, что он делает это только в том случае, если пробелы подряд; однако нет проверки, чтобы убедиться, что предыдущий символ был на самом деле пробелом. Для этого нужно что-то вроде

кто-то, кто действительно знает C, вероятно, мог бы написать это лучше, но это общая идея.

на другой потенциально интересной ноте, для ваш пример, если вы используете PHP >= 5.4, это дает тот же результат, что и usort, упомянутый Аароном сараем (он также теряет ассоциации ключа/значения):

Илон Маск рекомендует:  Тег link

взгляните на bugs.php.net #26412 (natsort () сжимал несколько пробелов в 1 пробел). По-видимому, это поведение так «aa», «a a» и «a a» (обратите внимание на 2 пробела) не сортируются как идентичные строки.

Как и другие ответы/комментарии, это известная проблема. Однако вы можете написать свой собственный вид с помощью usort (). Попробуйте это и посмотрите, работает ли это:

Я заметил, что выход немного отличается от вашего предлагаемого ответа:

но я уверен, что это была опечатка — их нужно поменять местами. :)

php — Почему пробелы игнорируются в natsort/strnatcmp/strnatcasecmp?

Я использую strnatcmp в моей функции сравнения для сортировки имен пользователей в таблице. Для нашего бельгийского клиента мы получаем некоторые странные результаты. У них есть такие имена, как «Ван дер Брокке» и «Вандер Вейр», а strnatcasecmp(«Van der», «Vander») возвращает 0 !

Как естественное сравнение направлено на то, чтобы сортировать как человека, я не понимаю, почему пространства полностью игнорируются.

Но человек сказал бы:

Мое решение теперь состоит в том, чтобы заменить все пробелы символами подчеркивания, которые обрабатываются надлежащим образом. Два вопроса: Почему natsort работает так? Есть ли лучшее решение?

    1 3
  • 14 июл 2020 2020-07-14 17:07:27
  • Spork

3 ответа

Как и другие ответы/комментаторы, это известная проблема. Однако вы можете написать свой собственный вид с помощью usort(). Попробуйте это и посмотрите, работает ли он:

Я заметил, что результат немного отличается от вашего предлагаемого ответа:

Но я уверен, что это была опечатка — их нужно поменять местами.:)

  • 14 июл 2020 2020-07-14 17:07:28
  • Aaron Saray

Взгляните на bugs.php.net # 26412 (natsort() сжимал несколько пробелов до 1 пробела). По-видимому, это поведение «aa», «a» и «a» (обратите внимание на 2 пробела) не сортируют как идентичные строки.

  • 14 июл 2020 2020-07-14 17:07:28

  • Mark Leighton Fisher

Если вы посмотрите в исходном коде, вы можете увидеть это, что определенно похоже на ошибку: http://gcov.php.net/PHP_5_3/lcov_html/ext/standard/strnatcmp.c.gcov.php (прокрутите вниз до строки 130):

Обратите внимание, что ссылка на 5.3, но тот же код все еще существует в 5.5 (http://gcov.php.net/PHP_5_5/lcov_html/ext/standard/strnatcmp.c.gcov.php) По общему признанию, мои знания C ограничены, но в основном это, по-видимому, продвигает указатель на каждую строку, если текущий символ является пространством, по сути игнорируя этот символ в сортировке. Комментарий подразумевает, что он делает это только в том случае, если пробелы последовательны; однако нет никакой проверки, чтобы предыдущий символ был фактически пространством в первую очередь. Для этого потребуется что-то вроде

Кто-то, кто действительно знает C, вероятно, мог бы написать это лучше, но что общая идея.

В другом потенциально интересном случае для вашего примера, если вы используете PHP >= 5.4, это дает тот же результат, что и usort, упомянутый Aaron Saray (он также теряет ассоциации key/value):

Илон Маск рекомендует:  Метод группового учета аргументов мгуа

Что такое код strnatcasecmp

strnatcasecmp — Case insensitive string comparisons using a «natural order» algorithm

Description int strnatcasecmp ( string str1, string str2 )

This function implements a comparison algorithm that orders alphanumeric strings in the way a human being would. The behaviour of this function is similar to strnatcmp() , except that the comparison is not case sensitive. For more information see: Martin Pool’s Natural Order String Comparison page.

Similar to other string comparison functions, this one returns str1 is less than str2 > 0 if str1 is greater than str2 , and 0 if they are equal.

strnatcasecmp

(PHP 4, PHP 5, PHP 7)

strnatcasecmp — Case insensitive string comparisons using a «natural order» algorithm

Description

This function implements a comparison algorithm that orders alphanumeric strings in the way a human being would. The behaviour of this function is similar to strnatcmp() , except that the comparison is not case sensitive. For more information see: Martin Pool’s » Natural Order String Comparison page.

Parameters

The first string.

The second string.

Return Values

Similar to other string comparison functions, this one returns str1 is less than str2 > 0 if str1 is greater than str2 , and 0 if they are equal.

See Also

  • preg_match() — Perform a regular expression match
  • strcmp() — Binary safe string comparison
  • strcasecmp() — Binary safe case-insensitive string comparison
  • substr() — Return part of a string
  • stristr() — Case-insensitive strstr
  • strncasecmp() — Binary safe case-insensitive string comparison of the first n characters
  • strncmp() — Binary safe string comparison of the first n characters
  • strstr() — Find the first occurrence of a string
  • setlocale() — Set locale information

User Contributed Notes

There seems to be a bug in the localization for strnatcmp and strnatcasecmp. I searched the reported bugs and found a few entries which were up to four years old (but the problem still exists when using swedish characters).

These functions might work instead.
function _strnatcasecmp ( $left , $right ) <
return _strnatcmp ( strtolower ( $left ), strtolower ( $right ));
>

function _strnatcmp ( $left , $right ) <
while(( strlen ( $left ) > 0 ) && ( strlen ( $right ) > 0 )) <
if( preg_match ( ‘/^([^0-9]*)([0-9].*)$/Us’ , $left , $lMatch )) <
$lTest = $lMatch [ 1 ];
$left = $lMatch [ 2 ];
> else <
$lTest = $left ;
$left = » ;
>
if( preg_match ( ‘/^([^0-9]*)([0-9].*)$/Us’ , $right , $rMatch )) <
$rTest = $rMatch [ 1 ];
$right = $rMatch [ 2 ];
> else <
$rTest = $right ;
$right = » ;
>
$test = strcmp ( $lTest , $rTest );
if( $test != 0 ) <
return $test ;
>
if( preg_match ( ‘/^([0-9]+)([^0-9].*)?$/Us’ , $left , $lMatch )) <
$lTest = intval ( $lMatch [ 1 ]);
$left = $lMatch [ 2 ];
> else <
$lTest = 0 ;
>
if( preg_match ( ‘/^([0-9]+)([^0-9].*)?$/Us’ , $right , $rMatch )) <
$rTest = intval ( $rMatch [ 1 ]);
$right = $rMatch [ 2 ];
> else <
$rTest = 0 ;
>
$test = $lTest — $rTest ;
if( $test != 0 ) <
return $test ;
>
>
return strcmp ( $left , $right );
>
?>

The code is not optimized. It was just made to solve my problem.

Илон Маск рекомендует:  Что такое код mhash_get_hash_name

Что такое код strnatcasecmp

strnatcasecmp — сравнение строк без учёта регистра с использованием алгоритма «natural order».

Описание

int strnatcasecmp (string str1, string str2)

Эта функция реализует алгоритм сравнения, упорядочивающий алфавитно-числовые строки «человеческим» способом. Поведение этой функции похоже на strnatcmp() , но сравнение нечувствительно к регистру. Дополнительно см. страницу Martin’а Pool’а Natural Order String Comparison.

Как и другие функции сравнения строк, эта возвращает str1 меньше str2 ; > 0, если str1 больше str2 ; 0, если они равны.

Функция PHP strnatcasecmp

int strnatcasecmp ( string str1, string str2 )

Эта функция реализует алгоритм сравнения, упорядочивающий алфавитно-цифровые строки подобно тому, как это сделал бы человек. Эта функция подобна strnatcmp, за исключением того, что strnatcasecmp не учитывает регистр символов. Для получения дополнительной информации см. Natural Order String Comparison

Подобно другим функциям сравнения строк, strnatcasecmp возвращает отрицательное число, если str1 меньше, чем str2; положительное число, если str1 больше, чем str2, и 0 если строки равны.

Что такое код strnatcasecmp

strnatcasecmp — сравнение строк без учёта регистра с использованием алгоритма «natural order».

Описание

int strnatcasecmp (string str1, string str2)

Эта функция реализует алгоритм сравнения, упорядочивающий алфавитно-числовые строки «человеческим» способом. Поведение этой функции похоже на strnatcmp() , но сравнение нечувствительно к регистру. Дополнительно см. страницу Martin’а Pool’а Natural Order String Comparison.

Как и другие функции сравнения строк, эта возвращает str1 меньше str2 ; > 0, если str1 больше str2 ; 0, если они равны.

Strnatcasecmp

Php функции


Php скрипты


strnatcasecmp

strnatcasecmp — Сравнение строк без учета регистра с использованием алгоритма «естественного упорядочения»

Описание

int strnatcasecmp ( string str1, string str2 )

Эта функция реализует алгоритм сравнения, упорядочивающий алфавитно-цифровые строки подобно тому, как это сделал бы человек. Эта функция подобна strnatcmp(), за исключением того, что strnatcasecmp() не учитывает регистр символов. Для получения дополнительной информации см.

Подобно другим функциям сравнения строк, strnatcasecmp() возвращает отрицательное число, если str1 меньше, чем str2 ; положительное число, если str1 больше, чем str2 , и 0 если строки равны.

User Contributed Notes

There are no user contributed notes for this page

Что такое код strnatcasecmp

strnatcasecmp — Case insensitive string comparisons using a «natural order» algorithm

Description int strnatcasecmp ( string str1, string str2)

This function implements a comparison algorithm that orders alphanumeric strings in the way a human being would. The behaviour of this function is similar to strnatcmp() , except that the comparison is not case sensitive. For more information see: Martin Pool’s Natural Order String Comparison page.

Similar to other string comparison functions, this one returns str1 is less than str2 ; > 0 if str1 is greater than str2 , and 0 if they are equal.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL