Ordinamento di array

 
Ordinamento di elementi

Se vi capita di scrivere un array di oggetti (o di array) e di doverlo poi ordinare secondo criteri definiti, quale sono gli strumenti che php ci mette a disposizione? Vediamo ora come creare dei propri criteri di ordinamento e come ordinare questi array.

Nel caso preso in esempio si crea un array di oggetti di tipo rectangle e si vuole ordinare l'array per l'area che questi hanno.

Iniziamo definendo la classe:

<?php
class rectangle {
  protected
$w;
  protected
$h;
 
 
// Constructor
 
public function __construct($width = 0, $height = 0) {
   
$this->w = $width;
   
$this->h = $height;
  }
 
// Convert to string
 
public function __toString() {
  return
"width:  " . $this->w . "\n" .
        
"height: " . $this->h . "\n" . "\n";
  }
 
// Calculate rectangle area
 
public function area() {
    return
$this->w * $this->h;
  }
 
// Other method (not rilevant)
  // ...
}
?>

A questo punto generiamo un array di oggetti (in questo caso con dimensioni random)

<?php
$rectangles
= array();
for(
$i = 0; $i < 10; $i++ )
{
 
$width  = rand(1, 100);
 
$height = rand(1, 100);
 
 
$rec = new rectangle($width, $height);
 
  print
$rec;
 
 
$rectangles[$rec->area()] = $rec;
}
?>

andiamo a visualizzare il nostro elenco di rettangoli e avremmo qualche cosa simile a:

Array
(
  [609] => rectangle Object
    (
      [w:protected] => 21
      [h:protected] => 29
    )
  [7776] => rectangle Object
    (
      [w:protected] => 81
      [h:protected] => 96
    )
  // ...
  [2552] => rectangle Object
    (
      [w:protected] => 44
      [h:protected] => 58
    )
  [448] => rectangle Object
    (
      [w:protected] => 7
      [h:protected] => 64
    )
)

a questo punto, per poter effettuare l'operazione di ordinamento andiamo a usare la funzione uasort che ci permette di definire una funzione di callback che può essere usata per la generazione della condizione di ordinamento.

La funzione passata come funzione di callback non deve fare altro che restiruire un valore positivo (+1) se il primo termine è maggiore del secondo, o negativo (-1) nel caso contrario. Nel nostro caso andiamo ad inserire questa funzione all'interno della classe rectangle, definendola come statica, quindi:

<?php
class rectangle {
 
// ...
 
static function order(rectangle $a, rectangle $b) {
    if (
$a->area() < $b->area())
    {
      return -
1;
    }
    else
    {
      return
1;
    }
  }
}
?>

Avendo ovviamente omesso tutte le funzioni non necessarie. A questo punto possiamo procedere con l'ordinamento dell'array tramite:

<?php
uasort
($rectangles, 'rectangle::order');
?>

ovviamente essendo una caratteristica del nostro oggetto rectangle la soluzione migliore è di creare un metodo statico per l'ordinamento dell'array, in modo da lasciare al suo interno gli algoritmi necessari. Otterremo, quindi, il seguente codice nella classe:

<?php
class rectangle {
 
// ...
 
public static function order(&$rectangles) {
   
uasort($rectangles, 'rectangle::order_info');
  }
  private static function
order_info(rectangle $a, rectangle $b) {
    if (
$a->area() < $b->area())
    {
      return -
1;
    }
    else
    {
      return
1;
    }
  }
}
?>

quindi per poter ordinare il nostro array di rettangoli è sufficiente scrivere:

<?php
rectangle
::order($rectangles);
?>

In allegato il codice risultante di questo esempio.

Come sempre domande e suggerimenti sono ben accetti!

AllegatoDimensione
Codice di esempio1009 byte

Altri contenuti che potrebbero interessarti

  • SASS per i CSS con Compass (in ruby)
    Come indicato nell'articolo precedente abbiamo visto la comodità di usare un metalinguaggio per i CSS come SASS. Ovviamente i browser non sono in grado di utilizzare direttamente questi file, ma necessitano di ricevere del codice CSS standard. Questa operazione (NdA:la conversione da SASS a CSS)...
  • Nello sviluppo di siti web è preferibile operare in locale e trasferire il tutto sul server remoto solo una volta che si è ottimizzata la configurazione per lo scopo che ci si è prefissi. Ciò permette di avere una maggior velocità poiché non è necessario operare sul server trasferendo i file ogni...
  • SASS per i CSS
    I CSS sono uno degli elementi che nel corso degli anni, nel settore del web, si sono meno evoluti dal pundo ti vista della struttura utilizzata. Nelle corso delle diverse versioni sono state aggiunge solo proprietà e selettori nuovi. Probabilmente penserete: Se non sono cambiati tantomeglio, evito...
  • Pagina di ricerca con filtri dinamici nelle views
    Le viste sono uno strumento estremamente potente e permettono di andare ad elaborare le informazioni creando degli elementi (pagine, blocchi, ...) di presentazione. La possibilità di usare dei filtri esposti ne fa degli strumenti adatti alla creazione di strumenti di ricerca dei contenuti. L'...

Commenti

Invia nuovo commento





  • Elementi HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <h2> <h3> <h4> <table> <thead> <tbody> <tr> <th> <td>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Linee e paragrafi vanno a capo automaticamente.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente

Maggiori informazioni sulle opzioni di formattazione.



Condividi contenuti