For those of you who are looking for a way to integrate natural sorting with the UCA rules this hack seems to work:
<?php
$array = array
(
'1', '100',
'al', 'be',
'Alpha', 'Beta',
'Álpha', 'Àlpha', 'Älpha',
'かたかな',
'img1.png', 'img2.png',
'img10.png', 'img20.png'
);
echo '<pre>';
print_r(sortIntl($array, true));
echo '</pre>';
function sortIntl($array, $natural = true)
{
$data = $array;
if ($natural === true)
{
$data = preg_replace_callback('~([0-9]+)~', 'natsortIntl', $data);
}
collator_asort(collator_create('root'), $data);
return array_intersect_key($array, $data);
}
function natsortIntl($number)
{
return sprintf('%032d', $number);
}
?>
Output:
Array
(
[0] => 1
[1] => 100
[2] => al
[3] => be
[4] => Alpha
[5] => Beta
[6] => Álpha
[7] => Àlpha
[8] => Älpha
[9] => かたかな
[10] => img1.png
[11] => img2.png
[12] => img10.png
[13] => img20.png
)
Collator::asort
collator_asort
(PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
Collator::asort -- collator_asort — Ordenar un array manteniendo la relación de índices
Descripción
Estilo orientado a objetos
&$arr
[, int $sort_flag
] )Estilo por procedimientos
Esta función ordena un array de forma que sus índices mantienen su correlación con los elementos del array a los que están asociados. Se usa principalmente en la ordenación de arrays asociativos donde el orden real de los elementos es significativo. Los elementos del array estarán ordenados según las normas actuales regionales.
Es equivalente al estándar de PHP asort().
Parámetros
-
coll -
Un objeto Collator.
-
arr -
El array de cadenas a ordenar.
-
sort_flag -
El tipo de ordenación opcional, uno de los siguientes:
-
Collator::SORT_REGULAR- comparar los elementos de forma normal (no cambia los tipos) -
Collator::SORT_NUMERIC- comparar los elementos de forma numérica -
Collator::SORT_STRING- comparar los elementos como cadenas
El valor predeterminado de $sort_flag value es
Collator::SORT_REGULAR. También se utiliza si se ha especificado un valor no válido para $sort_flag. -
Valores devueltos
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplos
Ejemplo #1 Ejemplo de collator_asort()
<?php
$coll = collator_create( 'en_US' );
$arr = array(
'a' => '100',
'b' => '50',
'c' => '7'
);
collator_asort( $coll, $arr, Collator::SORT_NUMERIC );
var_export( $arr );
collator_asort( $coll, $arr, Collator::SORT_STRING );
var_export( $arr );
?>
El resultado del ejemplo sería:
array ( 'c' => '7', 'b' => '50', 'a' => '100', )array ( 'a' => '100', 'b' => '50', 'c' => '7', )
Ver también
- Las constantes de Collator
- collator_sort() - Ordenar un array usando cotejador especificado
- collator_sort_with_sort_keys() - Ordenar un array usando el cotejador y las claves de ordenación especificados
