2009-05-08 10 views
45

Ho creato una macchina anagramma e ho una serie di corrispondenze positive. Il problema è che sono tutti in un ordine diverso, voglio essere in grado di ordinare l'array in modo che i valori di array più lunghi vengano visualizzati per primi.PHP: ordina una matrice in base alla lunghezza dei suoi valori?

Qualcuno ha qualche idea su come farlo?

risposta

124

Usa http://us2.php.net/manual/en/function.usort.php

con questa funzione personalizzata

function sort($a,$b){ 
    return strlen($b)-strlen($a); 
} 

usort($array,'sort'); 

Usa uasort se si desidera mantenere i vecchi indici, utilizzare usort se non vi interessa.

Inoltre, credo che la mia versione sia migliore perché usort è un ordinamento instabile.

$array = array("bbbbb", "dog", "cat", "aaa", "aaaa"); 
// mine 
[0] => bbbbb 
[1] => aaaa 
[2] => aaa 
[3] => cat 
[4] => dog 

// others 
[0] => bbbbb 
[1] => aaaa 
[2] => dog 
[3] => aaa 
[4] => cat 
+13

Questo è buono, anche se non chiamerei la funzione solo 'ordina'. sortByLength di seguito è più descrittivo. –

+5

a tutti - ricorda di mb_strlen() - non tutti i lang sono uguali – Jeffz

+0

No Brian, il lavoro della funzione non è di ordinare, ma di confrontare. Quindi lo chiamerei compareStrLengthNegatively – fishbone

9
function sortByLength($a,$b){ 
    if($a == $b) return 0; 
    return (strlen($a) > strlen($b) ? -1 : 1); 
} 
usort($array,'sortByLength'); 
+1

C'è un bug in questo. La tua condizione di uguaglianza è troppo stretta. Le stringhe "abc" e "def" dovrebbero restituire 0 da questo tipo, ma non lo faranno. Torneranno invece 1. E mentre mi rendo conto che questo non è un grave errore (l'output non * apparirà * rotto, è tecnicamente impreciso –

+1

'if ($ a == $ b) restituisce 0;' questo è un errore, stiamo parlando di lunghezza – Thinker

+0

@ Peter and Thinker, sì è una stranezza del manuale PHP, io stesso ho strlen ($ a) == strlen ($ b), ma poi ho visto che dal momento che PHP usa un instabile non importa, non importa! Ancora incasina l'ordine, quindi ho trovato la funzione più breve che funzioni. – Unknown

-1

Ecco un modo in cui l'ho fatto in passato.

// Here's the sorting... 
$array = array_combine($words, array_map('strlen', $words)); 
arsort($array); 
+0

array con lo stesso valore sarà combinato: array (" aba "," aa "," annuncio "," vcd "," aba "); –

-5

È semplice.

function LSort(a,b){return a.length-b.length;} 

var YourArray=[[1,2,3,4,5,6], ['a','b'], ['X','Y','Z'], ['I','Love','You'], ['good man']]; 

YourArray.sort(Lsort); 

Risultato:

['good man'] Length=1 
['a','b'] Length=3 
['X','Y','Z'] Length=3 
['I','Love','You'] Length=3 
[1,2,3,4,5,6] Length=6 
+11

PHP! = JavaScript. –

+2

Si prega di dare un'occhiata a [questa pagina di aiuto Markdown] (http://stackoverflow.com/editing-help) per migliorare le tue capacità di formattazione. – Gumbo

49

Se vuoi farlo nel modo in cui 5.3 di PHP, si potrebbe desiderare di creare qualcosa di simile:

usort($array, function($a, $b) { 
    return strlen($b) - strlen($a); 
}); 

In questo modo hai vinto' t inquina il tuo spazio dei nomi globale.

Ma fallo solo se ne hai bisogno in un unico punto del codice sorgente per mantenere le cose ASCIUTTE.

1

Creare un array di strlen di elementi di array oyur e multisort con l'array.

foreach($Yourarray as $c=>$key) {    
    $key['maxlen'] = strlen($key); 
    $sort_numcie[] = $key['maxlen']; 
} 

array_multisort($sort_numcie, $Yourarray); 

Questo funzionerà sicuramente. Sono sicuro!

0

Oltre alla risposta accettata, per ordinare un array per lunghezza con ordine crescente o decrescente:

function strlen_compare($a,$b){ 
    if(function_exists('mb_strlen')){ 
     return mb_strlen($b) - mb_strlen($a); 
    } 
    else{ 
     return strlen($b) - strlen($a); 
    } 
} 

function strlen_array_sort($array,$order='dsc'){ 
    usort($array,'strlen_compare'); 
    if($order=='asc'){ 
     $array=array_reverse($array); 
    } 
    return $array; 
} 
16

PHP7 sta arrivando. In PHP7, è possibile utilizzare lo Spaceship Operator.

usort($array, function($a, $b) { 
    return strlen($b) <=> strlen($a); 
}); 

Spero che questo possa aiutarti in futuro.

Problemi correlati