Divdimensiju masīvu kārtošana
14. October, 2007, 17:10 PHP, Web izstrādeVai Jums bieži ir nācies mēģināt sakārtot masīvu, piemēram, pēc alfabēta ? Droši vien bieži. Un tas ir viegli - sort(). Bet ko darīt, kad nākas kārtot divdimensiju masīvu, bet kārtošana jāveic pēc kāda elementa, kas nav pirmā līmeņa elements ? Tad palīgā nāk usort() funkcija.
usort() funkcija ir paredzēta, lai veidotu specifiskas masīvu kārtošanas metodes.
Tālāk būs vienkāršs piemērs kā izmantot šo funkciju.
Piemērs
Pieņemsim, ka mums ir masīvs ar desām un to pieejamību noliktavā.
$sausages = array(
array('Doktordesa', 12),
array('Salami', 124),
array('Siera desa', 43),
array('Cīsiņi', 32),
array('Medniekdesiņas', 67)
)
Un mums ir vajadzīgs sakārtot šo masīvu pēc desu pieejamības noliktavā. Sākot ar vismazāk pieejamo. Tātad sort() un līdzīgas PHP kārtošanas funkcijas mums nederēs. Izmantosim jau iepriekš pieminēto usort(). Sāksim ar šādu funkciju:
function sortSausages($a, $b) {
if ($a[1] == $b[1]) {
return 0;
} elseif ($a[1] < $b[1]) {
return -1;
} else {
return 1;
}
}
Un rindiņa, kas izmantos šo funkciju, lai sakārtotu $sausages masīvu:
usort($sausages, 'sortSausages');
Tātad - kā notiek kārtošana ? usort() funkcija “ar sev vien zināmu” algoritma palīdzību izvēlas divus elementus no masīva un padot tos mūsu definētajai funkcijai sortSausages(). Tālāk šī mūsu funkcija salīdzina šos divus elementus, precīzāk - tā salīdzina desu skaitu abiem padotajiem elementiem. Ja desu skaits ir vienāds, tā atgriež 0 (tieši 0, nevis false). Tad usort() funkcija nemaina šo divu elementu secību, bet atstāj to tādu kāda tā ir. Ja $a elementā norādītais skaits ir mazāks par $b elementā norādīto, tad funkcija atgriež negatīvu skaitli (piem., -1), ja otrādi - tad pozitīvu skaitli (piem, 1). Ņemot vērā atgriezto vērtību, usort() funkcija zina, ko darīt ar šiem elementiem - kurš ir mazāks, kurš lielāks, un vai vajag mainīt to atrašanās vietu masīvā. Tas nozīmē, ka ja atgriezts tiek -1, tad $a elementam sarakstā jābūt pirms $b. Un otrādi.
Masīvs pēc kārtošanas (print_r() outputs):
Array
(
[0] => Array
(
[0] => Doktordesa
[1] => 12
)
[1] => Array
(
[0] => Cīsiņi
[1] => 32
)
[2] => Array
(
[0] => Siera desa
[1] => 43
)
[3] => Array
(
[0] => Medniekdesiņas
[1] => 67
)
[4] => Array
(
[0] => Salami
[1] => 124
)
)
Voila! Viss strādā! :)
Ja mēs gribētu šo pašu masīvu sakārtot pēc desas nosaukuma alfabētiskā secībā, tad būtu vajadzīga apmēram šāda funkcija:
function sortSausages($a, $b) {
return strcmp($a[0], $b[0]);
}
Noslēgumā
Kā jau domājams nopratāt, tad usort() var izmantot ne tikai divdimensiju masīvu kārtošanai. Galvenā tās funkcija ir nodrošināt kārtošanu pēc nestandarta parametriem.


15. October, 2007, 12:57
izskatās ka desas pēc skaita var kārto arī ar šitadu f-ju
function sortSausages($a, $b) {
return $a[1] - $b[1];
}
jo The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
speciāli par -1 un +1 nekas nav teikts.
15. October, 2007, 13:03
Taisnība, neaizdomājos :)