Ordinamento personalizzato di array multidimensionali con PHP all'interno di classi (usort,asort)

ATTENZIONE! Il post ha più di 2 anni e le informazioni contenute potrebbero essere obsolete (ad esempio a causa di un aggiornamento di versione rispetto agli elementi descritti o links modificati da siti esterni).

Riprendendo la funzione utilizzata in un precedente articolo è possibile utilizzarla anche all’interno di una classe praticamente senza ulteriori modifiche:

<?php
class nomeClasse{
 
 function ordina($array_da_odinare){
 
 function cmp($a, $b)
 {
 $aq = $a['PersonaCampoTipo']['order'];
 $bq = $b['PersonaCampoTipo']['order'];
 
 if ($a == $b) {
 return 0;
 }
 return ($aq < $bq) ? -1 : 1;
 }
 
 uasort($array_da_odinare, "cmp");
 }
 
}
?>

Lo script funziona correttamente ma se la funzione nomeClasse->ordina() venisse richiamata più volte (ad esempio all'interno di un ciclo) l'ambiente PHP genera un errore e blocca l'esecuzione in quanto la funzione cmp() viene ridichiarata. Per ovviare al problema si deve quindi modificare il codice:

<?php
class nomeClasse{
 
 function ordina($array_da_odinare){
 uasort($array_da_odinare, array(&$this, "cmp"));
 }
 
 function cmp($a, $b)
 {
 $aq = $a['PersonaCampoTipo']['order'];
 $bq = $b['PersonaCampoTipo']['order'];
 
 if ($a == $b) {
 return 0;
 }
 return ($aq < $bq) ? -1 : 1;
 }
}
?>

Come si vede dal codice il secondo parametro della funzione uasort() non è più una stringa con il nome della funzione personalizzata di ordinamento ma un array con il riferimento alla classe stessa e successivamente alla funzione.

 


Commenti