PHP: Taulukon lajittelu pituusjärjestykseen

Relevanssia fiksatessa tuli vastaan tarve lajitella sanoja sisältävä taulukko pituusjärjestykseen niin, että pisin sana tulee ensin (jotta hakusanojen korostus tekstissä toimii oikein*). Tähän tehtävään on olemassa varsin näppärä ratkaisu, vaikka PHP ei suoranaisesti valmista konstia tarjoakaan.

StackOverflow’sta löytyi erittäin kompakti funktio: Sort an array by the length of its values?. Tehtävään tarvitaan PHP:n usort-funktiota, joka antaa määritellä käytettävän lajittelumetodin. Funktiolle annetaan lajiteltava taulukko ja vertailufunktio, jolla arvot pistetään ojennukseen. Vertailufunktio ottaa kaksi parametriä, elementit a ja b, ja kertoo kumpi kuuluu ensin.

Tässä tapauksessa vertailufunktio on hyvin yksinkertainen:

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

Jos b on pidempi, funktio palauttaa positiivisen arvon, mikä tarkoittaa että b on suurempi kuin a. Jos a on suurempi, arvo on negatiivinen. Vaihtamalla strlen-funktioihin a:n ja b:n toisin päin saa funktion, joka lajittelee lyhyimmät merkkijonot ensin.

Sitten vain lajitellaan:

usort($array,'sort');

Helppo juttu. Uasort-funktio tekee saman, mutta säilyttää taulukon indeksit.

* Relevanssiin tämä liittyy siten, että jos haetaan vaikka ”in india” ja Relevanssi kohtaa tekstistä sanan ”india”, siitä korostetaan ensin ”in” alusta, jonka jälkeen koko sanan korostus ei toimikaan. Hups. Kun korostettavat sanat lajitelleen isoimmat ensin, ensin korostetaan ”india”, joka poistaa ongelman. Tälläkin tavalla tulee turhia sisäkkäisiä korostuksia, jotka pitäisi varmaan siivota pois, mutta ne eivät varsinaisesti haittaa.

Kysy tai kommentoi

  • (ei näy muille)

XHTML: Voit käyttää näitä tägejä: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">