2012-03-23 7 views
5

Estoy buscando ordenar naturalmente una matriz, en orden inverso y no conservar las claves. Por ejemplo, me gustaría que esta matriz:Clasificación natural de matriz de PHP en reversa y no preservar las claves

[0] => 1-string 
[1] => 2-string 
[2] => 10-string 
[3] => 4-srting 
[4] => 3-srting 

terminar como esto:

[0] => 10-srting 
[1] => 4-string 
[2] => 3-string 
[3] => 2-string 
[4] => 1-string 

lo tengo cercano con usort ($ matriz, 'strnatcmp'); pero no está en orden inverso. array_reverse() después no ayuda.

¿Alguna idea?

+0

¿Es ese orden natural o antinatural? Pensé que lo natural era "contar", por lo que sería '1 cuerda, 10 cuerdas, 2 cuerdas, 3 cuerdas, 4 cuerdas' y antinatural sería' 4 cuerdas, 3 cuerdas, 2 cuerdas, 10 -string, 1-cadena'. Se me conoce que malinterprete las cosas (ya que estoy casado y las comunicaciones erróneas suceden las 24 horas del día, los 7 días de la semana), así que podría dar una explicación más profunda, ya que no entiendo su sistema de pedidos. – Michael

+0

Natural es 1, 2, 3, 4, 10, lo que puedo hacer. Ahora necesito obtenerlo en orden inverso, entonces: 10, 4, 3, 2, 1. – Phil

Respuesta

4

estoy un poco confundido acerca de "array_reverse() después de no ayuda." porque

<?php 
echo PHP_VERSION, "\n"; 

$x = array( 
    '1-string', 
    '2-string', 
    '10-string', 
    '4-srting', 
    '3-srting' 
); 

natsort($x); 
$x = array_reverse($x, false); 
print_r($x); 

impresiones

5.3.8 
Array 
(
    [0] => 10-string 
    [1] => 4-srting 
    [2] => 3-srting 
    [3] => 2-string 
    [4] => 1-string 
) 

en mi máquina

+0

¡Ahora está funcionando! No estoy seguro de lo que estaba haciendo mal ... Gracias. – Phil

0

¿No es lo que necesita?

+0

No. Eso me da 4, 3, 2, 10, 1. – Phil

+0

no porque los trata como cadenas http://codepad.org/wb4cv8hO –

5

Utilice el atributo $preserveKeys de array_reverse() para restablecer las claves, así como para invertir la matriz después de natcasesort().

function rnatcasesort(&$array) { 
    natcasesort($array); 
    $array = array_reverse($array, false); 
} 

$values = array('1-string', '2-string', '10-string', '4-string', '3-string'); 

rnatcasesort($values); 

var_dump($values); 

/* 
array(5) { 
    [0]=> 
    string(9) "10-string" 
    [1]=> 
    string(8) "4-string" 
    [2]=> 
    string(8) "3-string" 
    [3]=> 
    string(8) "2-string" 
    [4]=> 
    string(8) "1-string" 
} 
*/ 

0

Usted podría hacer

<?php 
$arr = array("1-string", "2-string", "10-string","4-srting", "3-srting"); 

function sort_reverse($a, $b){ 
    $a = (int)$a; 
    $b = (int)$b; 
    if ($a > $b){ 
    return -1; 
    } 
    if ($a < $b){ 
    return 1; 
    } 
    return 0; 
} 
usort($arr, "sort_reverse"); 
var_dump($arr); 

almohadilla aquí http://codepad.org/6dn81S3f

0

funciona esto:

$array = array('1-string', '2-string', '10-string', '4-string', '3-string'); 
natsort($array); 
$array = array_reverse($array); 
print_r($array); 
2

Uso rsort() con la bandera SORT_NATURAL.

rsort($array, SORT_NATURAL); 

SORT_NATURAL se introdujo en PHP 5.4. Si está en una versión inferior, vaya con la versión array_reverse (natsort()).

Cuestiones relacionadas