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.
strnatcasecmp
(PHP 4, PHP 5)
strnatcasecmp — Comparación de cadenas insensible a mayúsculas y minúsculas usando un algoritmo de "orden natural"
Descripción
Esta función implementa un algoritmo de comparación que ordena las cadenas alfanuméricas como lo haría un ser humano. El comportamiento de esta función es similar a strnatcmp(), pero la comparación no es sensible a mayúsculas y minúsculas. Para más información, vea la página de Martin Pool sobre » Comparación de Cadenas en Orden Natural.
De forma similar a otras funciones de comparación de cadenas, esta devuelve < 0 si cadena1 es menor que cadena2 ; > 0 si cadena1 es mayor que cadena2 , y 0 si son iguales.
Vea también ereg(), strcasecmp(), substr(), stristr(), strcmp(), strncmp(), strncasecmp(), strnatcmp() y strstr().
strnatcasecmp
25-Jul-2006 04:49
