2015-11-26 9 views
5

In PHP, la funzione usort accetta due argomenti: matrice per ordinare e un callback. Il callback accetta anche due argomenti: $ a e $ b. Quindi, confrontiamo questi due in ogni modo che vogliamo. Mi sorprende sempre, perché questo caso d'uso per usort non è troppo comune. Di solito ordiniamo valori con la stessa proprietà o utilizzando le stesse logiche sia per $ a che per $ b. Per esempio, se vogliamo ordinare in base alla lunghezza:C'è un semplice usort in PHP?

$animals = ['dog', 'tiger', 'giraffe', 'bear']; 

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

che funzionerà, ma abbiamo bisogno di dire strlen due volte. Sarebbe bello dire in questo modo:

usort($animals, function ($element) { 
    return strlen($element); 
}); 

e neppure come questo:

usort($animals, 'strlen'); 

Ho scritto questo tipo di funzione me stesso (utilizzando PHP 7 chicche, ma può essere facilmente modificato per PHP 5):

function simple_usort(array &$array, callable $callback): bool 
{ 
    return usort($array, function ($a, $b) use ($callback) { 
     return $callback($a) <=> $callback($b); 
    }); 
} 

Funziona perfettamente, ma non è già integrato in PHP in qualche altra funzione? In caso contrario, perché PHP non supporta questo modo molto popolare e conveniente di ordinare?

+3

per l'ultima parte, si potrebbe voler chiedere al gruppo php invece di noi ... lol – Andrew

+0

Non ho mai usato usort prima, e guardando questo, sono un po 'confuso dalla funzione di callback. La stringa di $ a è 3, e la stringa di $ b è 5. Quindi 3-5 è -2? Come usa il numero -2 per ordinare $ a e $ b? Scusa, so che sei tu a fare le domande qui, ma sono solo molto curioso. – frosty

+0

@Andrew Hai ragione, ma è quando sono sicuro che non mi manchi qualcosa. Il "perché" qui significa "Mi manca qualcosa?". –

risposta

2

Funziona perfettamente, ma non è già integrato in PHP in qualche altra funzione?

No.

Se no, perché PHP non supporta in questo modo molto popolare e conveniente di selezione?

Una lingua dovrebbe essere progettato per fornire generici strumenti per ottenere le cose fatte senza fornire una moltitudine di funzioni per soddisfare certi casi d'uso che possono o non possono essere popolare, ha concesso che le prestazioni non è influenzato negativamente da una tale decisione.

+0

Bene, PHP offre funzioni molto più esotiche di quelle che ho citato. Gli array da soli hanno tonnellate di funzioni incorporate in PHP, alcune delle quali non sono affatto generiche. –

+0

@RoboRobok Sì, stavo attento ad omettere la parte in cui php viola alcune delle migliori pratiche di progettazione del linguaggio ;-) –

0

Risposta semplice: poiché nessuno lo ha richiesto e nessuno l'ha implementato.

PHP è guidato da persone che hanno una patch o persone che motivano gli altri a scrivere una patch. Se una funzionalità non è interessante per nessuno, non è richiesta e non è implementata.

Credo che la funzione che si desidera sia troppo specifica e il guadagno sia troppo piccolo.

Ma se lo si desidera: aggiungere una richiesta di funzionalità tramite bugs.php.net o proporre una patch tramite github.