In questo articolo affronteremo il tema del confronto in PHP tra oggetti dello stesso tipo in base ad una specifica proprietà (o campo) dell’oggetto stesso. Nello specifico vedremo come implementare l’ordinamento di un array di oggetti da noi definiti tramite la funzione nativa PHP usort e un metodo da noi scritto che faccia la comparazione di due oggetti.
Cominciamo col definire un oggetto che abbia alcune proprietà, come ad esempio un’ipotetica Automobile che sarà dotata di alcune caratteristiche classiche come la marca, il modello, il numero di cavalli e il colore. La nostra classe PHP (in una versione molto semplificata) sarà così fatta:
class Automobile() {
$marca = 'Casa Automobilistica';
$modello = 'Base';
$num_cavalli = 16;
$colore = 'Nero';
function Automobile($marca, $modello, $num_cavalli, $colore){
$this->marca = $marca;
$this->modello = $modello;
$this->num_cavalli = $num_cavalli;
$this->colore = $colore;
}
}
Ora supponiamo di avere un’altra classe Ricerca, la quale contiene un array che chiameremo (con molta fantasia) $array_automobili composto da oggetti di tipo Automobile e di volerli ordinare all’interno dell’array stesso per il numero di cavalli. Tutto ciò che dobbiamo fare è scrivere un metodo che faccia il compare su una specifica proprietà tra due oggetti di tipo Automobile (a ben guardare, due oggetti qualsiasi che abbiano la proprietà in questione) e passarlo come parametro alla funziona usort. Nel nostro caso, per pigrizia, faremo una funzione (un metodo della classe Automobile) specifica per il campo num_cavalli che ordini le vetture in modo ascendente rispetto a quel campo.
function cmpAscNumCavalli($a, $b) {
if ($a->num_cavalli == $b->num_cavalli) {
return 0;
}
return ($a->num_cavalli < $b->num_cavalli) ? -1 : 1;
}
Per ordinare ora $array_automobili, il nostro array di oggetti di tipo Automobile, sarà sufficiente invocare la funzione PHP usort, passandole come parametri l’array stesso e il nome (quindi una stringa) del metodo che dovrà utilizzare per effettuare l’ordinamento.
Tenendo presente che nel nostro esempio stiamo lavorando in un contesto di classi e che la funzione che chiamiamo è un metodo della classe Automobile, invocata all’interno del codice della classe Ricerca, è necessario specificare anche a quale classe appartiene il metodo. Il tutto si scrive in questa maniera:
usort ( $array_automobili, array( 'Automobile', 'cmpAscNumCavalli' ) );
NB. Ricordo che usort non restituisce un nuovo array (in quanto funzione void) ma modifica direttamente l’array passato come parametro.