Can also be used with combination of a compare for an array nested value, like
<?php
$array = array(
"city" => "xyz",
"names" => array(
array(
"name" => "Ana2",
"id" => 1
) ,
array(
"name" => "Ana1",
"id" => 2
)
)
);
usort($array["names"], function ($a, $b) { return strnatcmp($a['name'], $b['name']);} );strnatcmp
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
strnatcmp
Референца за `function.strnatcmp.php` со подобрена типографија и навигација.
strnatcmp
(PHP 4, PHP 5, PHP 7, PHP 8)
strnatcmp — Споредби на низи користејќи алгоритам за „природно нарачување“
= NULL
Оваа функција имплементира алгоритам за споредба што ги нарачува алфанумеричките низи на начин на кој човек би ги нарачал, ова е опишано како „природно нарачување“. Имајте предвид дека оваа споредба е чувствителна на големи и мали букви.
Параметри
string1-
Првата низа.
string2-
Втората низа.
Вратени вредности
Враќа вредност помала од 0 ако string1
е помала од string2; вредност поголема од 0 ако string1 е поголемо од
string2Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во 0 ако се еднакви. Не може сигурно да се изведе никакво посебно значење од вредноста освен нејзиниот знак.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.2.0 |
Оваа функција веќе не е загарантирана да враќа
strlen($string1) - strlen($string2) кога должините на низите не се еднакви, но сега може да враќа -1 or
1 instead.
|
Примери
Пример за разликата помеѓу овој алгоритам и обичните алгоритми за сортирање низи на компјутер (искористени во strcmp()) може да се види подолу:
Пример #1 strcmp()
<?php
$arr1 = $arr2 = array("img12.png", "img10.png", "img2.png", "img1.png");
echo "Standard string comparison\n";
usort($arr1, "strcmp");
print_r($arr1);
echo "\nNatural order string comparison\n";
usort($arr2, "strnatcmp");
print_r($arr2);
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Standard string comparison
Array
(
[0] => img1.png
[1] => img10.png
[2] => img12.png
[3] => img2.png
)
Natural order string comparison
Array
(
[0] => img1.png
[1] => img2.png
[2] => img10.png
[3] => img12.png
)
Види Исто така
- preg_match() - Изврши совпаѓање со регуларен израз
- strcasecmp() - Бинарно безбедно споредување на низи што не е чувствително на големи и мали букви
- substr() - Врати дел од низа
- stristr() - strstr што не прави разлика помеѓу големи и мали букви
- strcmp() - Бинарно безбедно споредување на низи
- strncmp() - Бинарно безбедно споредување на првите n карактери
- strncasecmp() - Бинарно безбедно споредување на првите n знаци без разлика на големи и мали букви
- strnatcasecmp() - Споредби на низи чувствителни на големи и мали букви користејќи алгоритам за „природно нарачување“
- strstr() - Најди ја првата појава на низа
- natsort() - Сортирај низа користејќи алгоритам за „природно нарачување“
- natcasesort() - Сортирај низа користејќи алгоритам за „природно нарачување“ чувствителен на големи и мали букви
Белешки од корисници 4 белешки
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.
<?php
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.This function has some interesting behaviour on strings consisting of mixed numbers and letters.
One may expect that such a mixed string would be treated as alpha-numeric, but that is not true.
var_dump(strnatcmp('23','123')); →
int(-1)
As expected, 23<123 (even though first digit is higher, overall number is smaller)
var_dump(strnatcmp('yz','xyz')); →
int(1)
As expected, yz>xyz (string comparison, irregardless of string length)
var_dump(strnatcmp('2x','12y')); →
int(-1)
Remarkable, 2x<12y (does a numeric comparison)
var_dump(strnatcmp('20x','12y'));
int(1)
Remarkable, 20x>12y (does a numeric comparison)
It seems to be splitting what is being compared into runs of numbers and letters, and then comparing each run in isolation, until it has an ordering difference.Some more remarkable outcomes:
var_dump(strnatcmp("0.15m", "0.2m"));
int(1)
var_dump(strnatcmp("0.15m", "0.20m"));
int(-1)
It's not about localisation:
var_dump(strnatcmp("0,15m", "0,2m"));
int(1)
var_dump(strnatcmp("0,15m", "0,20m"));
int(-1)