Τρόποι για εύκολη ταξινόμηση πινάκων στην PHP

14 Σεπ 2011 | PHP,Χωρίς κατηγορία

Δεν επιτρέπονται τα σχόλια.


Όπως ήδη έχω αναφέρει στο άρθρο Δημιουργία πινάκων στην PHP, οι πίνακες είναι πολύ χρήσιμοι αν θέλετε να αποθηκεύσετε και να διαχειριστείτε μεγάλες ποσότητες δεδομένων. Ένας χρήσιμος τρόπος για να διαχειριστείτε αυτά τα δεδομένα είναι να τα ταξινομήσετε με διάφορους τρόπους.

Η PHP σας παρέχει ένα μεγάλο αριθμό συναρτήσεων για να ταξινομείτε τα στοιχεία πινάκων που χρησιμοποιούν διαφορετικά κριτήρια ταξινόμησης. Για παράδειγμα μπορείτε να έχετε αύξουσα ή φθίνουσα ταξινόμηση των στοιχείων, ταξινόμηση βάση του δείκτη ή ταξινόμηση βάση της τιμής των στοιχείων του πίνακα. Οι συναρτήσεις που σας παρέχει η PHP, κάνουν πολύ ποιο εύκολη τη ζωή του προγραμματιστή καθώς δεν είναι απαραίτητη η συγγραφή αλγορίθμων για την ταξινόμηση πινάκων.

Σε αυτό το άρθρο δεν θα προσπαθήσω να καλύψω κάθε συνάρτηση ταξινόμησης της PHP για πίνακες. Αντίθετα θα σας παρουσιάσω τις συναρτήσεις που θα χρειαστείτε περισσότερο σε καθημερινή βάση.

Ταξινόμηση πινάκων με δείκτες: Συναρτήσεις, sort() και rsort()

Η συνάρτηση sort() ταξινομεί τις τιμές σε ένα πίνακα με δείκτες σε αύξουσα κατεύθυνση. Αυτό σημαίνει πως το Α θα είναι πριν από το Ω και το 0 πριν από το 9. Τα κεφαλαία πάνε πριν τα πεζά και όλα τα γράμματα πάνε πριν τους αριθμούς.

$array_to_sort = array('Α', 9, 2, 'β', 3, 'δ', 'Ζ', 7);

sort($array_to_sort);

// Ο παρακάτω βρόχος θα εμφανίσει το αποτέλεσμα : Α Ζ β δ 2 3 7 9
foreach($array_to_sort as $value) { echo $value . ' '; }

Η συνάρτηση rsort() κάνει ακριβώς ότι κάνει και η sort() με τη διαφορά που η ταξινόμηση αυτή τη φορά είναι φθίνουσα.

$array_to_sort = array('Α', 9, 2, 'β', 3, 'δ', 'Ζ', 7);

rsort($array_to_sort);

// Ο παρακάτω βρόχος θα εμφανίσει το αποτέλεσμα : 9 7 3 2 δ β Ζ Α
foreach($array_to_sort as $value) { echo $value . ' '; }
Οι συναρτήσεις ταξινόμησης που μόλις είδαμε επιστρέφουν true αν ολοκληρώσουν την ταξινόμηση με επιτυχία και false αν δεν ολοκληρώσουν την ταξινόμηση.

Ταξινόμηση πινάκων με σχέσεις : Συναρτήσεις, asort() και arsort()

Οι συναρτήσεις, sort() και rsort() είναι κατάλληλες για ταξινόμηση πινάκων με δείκτες, όπου βασικά δεν σας απασχολεί και τόσο η σχέση μεταξύ τιμής και δείκτη. Θα πρέπει να σημειωθεί όμως πως σε πίνακες με σχέσεις αυτές οι δυο συναρτήσεις μπορεί να προκαλέσουν ανεπιθύμητα αποτελέσματα.

Δείτε το ακόλουθο παράδειγμα:

$array_to_sort = array(
"key_1" => "value_1",
"key_2" => "value_3"
"key_3" => "value_2"
);

sort($array_to_sort);

// Η print_r θα εμφανίσει : Array( [0] => value_1 [1] => value_2 [2] => value_3 )
print_r($array_to_sort);

Καθώς βλέπετε, η συνάρτηση sort() έχει δώσει εκ νέου δείκτες στις τιμές του πίνακα, και έχει ταξινομήσει τις τιμές με αύξουσα σειρά.

Αν θέλετε να κάνετε ταξινόμηση σε πίνακα με σχέσεις, και παράλληλα θέλετε να διατηρήσετε τις σχέσεις των τιμών με του δείκτες, τότε μπορείτε να χρησιμοποιήσετε τη συνάρτηση asort() ή τη συνάρτηση arsort(). Αυτές οι δυο συναρτήσεις δεν πραγματοποιούν ταξινόμηση των τιμών του πίνακα, αλλά διατηρούν και τις σχέσεις των τιμών με τους δείκτες.

Ταξινόμηση πίνακα με τη συνάρτηση asort():

$array_to_sort = array(
"key_1" => "value_1",
"key_2" => "value_3"
"key_3" => "value_2"
);

asort($array_to_sort);

// Η print_r θα εμφανίσει : Array( [key_1] => value_1 [key_3] => value_2 [key_2] => value_3 )
print_r($array_to_sort);

Το ίδιο με την rsort(), η arsort() πραγματοποιεί φθίνουσα ταξινόμηση ενώ παράλληλα διατηρεί και τις σχέσεις τιμών και δεικτών:

$array_to_sort = array(
"key_1" => "value_1",
"key_2" => "value_3"
"key_3" => "value_2"
);

arsort($array_to_sort);

// Η print_r θα εμφανίσει : Array( [key_2] => value_3 [key_3] => value_2 [key_1] => value_1 )
print_r($array_to_sort);

 Ταξινόμηση πινάκων με σχέσεις βάση δείκτη  με τις ksort() και krsort()

Όπως μπορείτε να ταξινομήσετε πίνακες με σχέσης βάση της τιμής, έτσι μπορείτε να ταξινομήσετε και πίνακες με σχέσεις βάση δείκτη. Η συνάρτηση ksort() πραγματοποιεί αύξουσα ταξινόμηση ενώ η συνάρτηση krsort() πραγματοποιεί φθίνουσα ταξινόμηση. Όπως συμβαίνει και με τις συναρτήσεις asort() και arsort() η ταξινόμηση, έτσι και οι συναρτήσεις ksort() και krsort() διατηρούν τις σχέσεις των δεικτών με τις τιμές τους.

Ακολουθούν μερικά παραδείγματα:

$artists_songs = array(
"The Doors" => "The End",
"Pink Floyd" => "The Wall",
"Jamiroquai" => "Cosmic Girl"
"Billy Idol" => "White wedding"
);

// Θα εκτυπώσει Array ( [Billy Idol] => White wedding [Jamiroquai] => Cosmic Girl [Pink Floyd] => The Wall [The Doors] => The End )
ksort($artists_songs);
print_r($artists_songs);

// Θα εκτυπώσει Array ( [The Doors] => The End [Pink Floyd] => The Wall [Jamiroquai] => Cosmic Girl [Billy Idol] => White wedding )
krsort($artists_songs);
print_r($artists_songs);

Ταξινόμηση πολλαπλών και πολυδιάστατων πινάκων με τη συνάρτηση array_multisort()

Η ισχυρή συνάρτηση array_multisort() μπορεί να ταξινομήσει πολλούς πίνακες ταυτόχρονα, διατηρώντας τις σχέσεις μεταξύ των δεικτών και των τιμών στα στοιχεία των πινάκων. Επίσης με τη συνάρτηση array_multisort() μπορείτε να ταξινομήσετε και πολυδιάστατους πίνακες. Ας αρχίσουμε με την ταξινόμηση μερικών πινάκων για αρχή και στη συνέχεια θα προσπαθήσουμε να ταξινομήσουμε και ένα πολυδιάστατο πίνακα.

Ταξινόμηση πολλών πινάκων

Για να ταξινομήσετε πολλούς πίνακες ταυτόχρονα με τη συνάρτηση array_multisort() απλά περνάτε ως ορίσματα όλους τους πίνακες που θέλετε να ταξινομήσετε. Ακολουθεί ένα παράδειγμα:

$artists = array(
"Βασίλης Παπακωνσταντίνου",
"Χρήστος Θηβαίος",
"Αλκίνοος Ιωαννίδης"
);

$songs = array(
"Ελλάς",
"Βροχή μου",
"Προσκυνητής"
);

$duration = array(
"4:30",
"5:16",
"3:29"
);

array_multisort($artists, $songs, $duration);

print_r($artists);
echo "<br />";
print_r($songs);
echo "<br />";
print_r($duration);
echo "<br />";

Ο παραπάνω κώδικας θα προβάλει το ακόλουθο αποτέλεσμα:

Array ( [0] => Αλκίνοος Ιωαννίδης [1] => Βασίλης Παπακωνσταντίνου [2] => Χρήστος Θηβαίος )
Array ( [0] => Προσκυνητής [1] => Ελλάς [2] => Βροχή μου )
Array ( [0] => 3:29 [1] => 4:30 [2] => 5:16 )

Παρατηρείστε πως η συνάρτηση array_multisort() ταξινόμησε πρώτα τα στοιχεία στον πίνακα $artists με αύξουσα ταξινόμηση, και στη συνέχεια ταξινόμησε τα στοιχεία των σχετικών με αυτόν πίνακα με την αντίστοιχη σειρά.

Αν θέλαμε όμως να τα ταξινομήσουμε βάση τίτλου όμως και όχι βάση καλλιτέχνι; Απλά θα αλλάξουμε τη σειρά με την οποία περνάμε τα τους πίνακες στη συνάρτηση array_multisort().

array_multisort($songs, $artists, $duration);

Ταξινόμηση με, μετά με, μετά …

Αν ο πρώτος πίνακας περιέχει κάποιες τιμές που είναι πανομοιότυπες τότε η συνάρτηση array_multisort() θα κάνει ταξινόμηση στον πρώτο πίνακα, μετά θα περάσει στον δεύτερο και ούτω καθεξής. Για παράδειγμα :

$artists = array('Αλκίνοος Ιωαννίδης', 'Βασίλης Παπακωνσταντίνου', 'Αλκίνοος Ιωαννίδης');
$songs = array('Προσκυνητής', 'Ελλάς', 'Όνειρο ήταν');
$duration = array('3:29', '4:30', '3:25');

array_multisort($artists, $songs, $duration);

print_r($artists);
echo "<br />";
print_r($songs);
echo "<br />";
print_r($duration);

Ο κώδικας παραπάνω θα εξάγει το ακόλουθο αποτέλεσμα:

Array ( [0] => Αλκίνοος Ιωαννίδης [1] => Αλκίνοος Ιωαννίδης [2] => Βασίλης Παπακωνσταντίνου )
Array ( [0] => Όνειρο ήταν [1] => Προσκυνητής [2] => Ελλάς )
Array ( [0] => 3:25 [1] => 3:29 [2] => 4:30 )

Αλλαγή σειράς ταξινόμησης

Αν θέλετε μπορείτε να περάσετε ένα προαιρετικό στοιχείο μετά από ένα πίνακα για να ελέγξετε τη σειρά ταξινόμησης για αυτό τον πίνακα. Οι πιθανές τιμές μπορούν να είναι οι ακόλουθες:

SORT_ASC, ταξινομεί με αύξουσα κατεύθυνση (προεπιλογή)
SORT_DESC, ταξινομεί με φθίνουσα κατεύθυνση

ΣημείωσηΥπάρχουν και άλλες σημαίες που μπορείτε να περάσετε στη συνάρτηση array_multisort(), καθώς επίσης και άλλες συναρτήσεις ταξινόμησης που μπορείτε να χρησιμοποιήσετε για να ελέγξετε τη σειρά ταξινόμησης.

Το παράδειγμα που ακολουθεί ταξινομεί τον πίνακα $artists με αύξουσα κατεύθυνση και τον πίνακα $songs με φθίνουσα κατεύθυνση.

$artists = array('Αλκίνοος Ιωαννίδης', 'Βασίλης Παπακωνσταντίνου', 'Αλκίνοος Ιωαννίδης');
$songs = array('Προσκυνητής', 'Ελλάς', 'Όνειρο ήταν');
$duration = array('3:29', '4:30', '3:25');

array_multisort($artists, SORT_ASC, $songs, SORT_DESC, $duration);

print_r($artists);
echo "<br />";
print_r($songs);
echo "<br />";
print_r($duration);

Το αποτέλεσμα της ταξινόμησης είναι το ακόλουθο :

Array ( [0] => Αλκίνοος Ιωαννίδης [1] => Αλκίνοος Ιωαννίδης [2] => Βασίλης Παπακωνσταντίνου )
Array ( [0] => Προσκυνητής [1] => Όνειρο ήταν [2] => Ελλάς )
Array ( [0] => 3:29 [1] => 3:25 [2] => 4:30 )

Ταξινόμηση πολυδιάστατων πινάκων

Αν περάσετε ένα πολυδιάστατο πίνακα στη συνάρτηση array_multisort() ως όρισμα, τότε η συνάρτηση θα ταξινομήσει τα στοιχεία βάση του πρώτου στοιχείου κάθε ένθετου πίνακα. Αν δυο ή περισσότερα στοιχεία έχουν την ίδια τιμή, τότε ταξινομεί βάση του δεύτερου στοιχείου και πάει λέγοντας.

Ακολουθεί ένα παράδειγμα που δείχνει τον τρόπο λειτουργίας, χρησιμοποιώντας ένα πολυδιάστατο πίνακα

$albums = array(
array(
'artist' => 'Αλκίνοος Ιωαννίδης',
'song' => 'Προσκυνητής'
'duration' => '3:29'
),
array(
'artist' => 'Βασίλης Παπακωνσταντίνου',
'song' => 'Ελλάς'
'duration' => '4:30'
),
array(
'artist' => 'Αλκίνοος Ιωαννίδης',
'song' => 'Όνειρο ήταν'
'duration' => '3:25'
)
);

array_multisort($albums);

echo "<pre>";
print_r($albums);
echo "</pre>";

Ο παραπάνω κώδικας θα έχει το ακόλουθο αποτέλεσμα:

Array
(
[0] => Array
(
[artist] => Αλκίνοος Ιωαννίδης
[song] => Όνειρο ήταν
[duration] => 3:25
)

[1] => Array
(
[artist] => Αλκίνοος Ιωαννίδης
[song] => Προσκυνητής
[duration] => 3:29
)

[2] => Array
(
[artist] => Βασίλης Παπακωνσταντίνου
[song] => Ελλάς
[duration] => 4:30
)

)

Μπορείτε να δείτε ότι η συνάρτηση array_multisort() έχει κάνει ταξινόμηση βάση του ονόματος του τραγουδιστή. Στους πίνακες που υπάρχει το ίδιο όνομα τραγουδιστή (Αλκίνοος Ιωαννίδης) η ταξινόμηση έχει γίνει με το όνομα του τραγουδιού.

Για να ταξινομήσετε τα στοιχεία του πίνακα με φθίνουσα κατεύθυνση μπορείτε ακόμα να χρησιμοποιήσετε ως όρισμα το SORT_DESC.

Περίληψη

Σε αυτό το άρθρο έχετε δει μερικές από τις ποιο κοινές συναρτήσεις ταξινόμησης της PHP.

  • sort() και rsort() για ταξινόμηση πινάκων με δείκτες
  • asort() και arsort() για ταξινόμηση πινάκων με σχέσεις
  • ksort() και krsort() για ταξινόμηση πινάκων με σχέσεις με βάση το δείκτη τους.
  • array_multisort() για να ταξινομείτε πολλούς πίνακες που συσχετίζονται με κάποιο τρόπο, καθώς επίσης και για ταξινόμηση πολυδιάστατων πινάκων.
Οι συναρτήσεις ταξινόμησης της PHP είναι πολύ ευέλικτες, και σας επιτρέπουν εύκολα και γρήγορα να ταξινομείτε πίνακες. Θα πρέπει να σημειωθεί πως τη στιγμή που γράφω αυτό το άρθρο υπάρχουν ακόμα άλλες δεκατρείς συνάρτησης ταξινόμησης που διανέμονται με την PHP και μπορείτε να τις βρείτε όλες εδώ.

Περισσότερα για τον CorfuGmr

CorfuGmr

Ονομάζομαι Νίκος και ασχολούμαι με το internet και την κατασκευή ιστοσελίδων από το 1998. Σήμερα, μετά από 12 χρόνια γεμάτα με ενημέρωση, εκπαίδευση και εξάσκηση έχω ανεβάσει σε ένα άλλο επίπεδο τις γνώσεις μου και τις τεχνικές μου. Στα άρθρα μου προσπαθώ να σας δείξω τα μικρά, αλλά σημαντικά πράγματα που με έχουν ανεβάσει σε αυτό το επίπεδο.








Σχόλια

Δεν υπάρχουν σχόλια ακόμα.

Συγνώμη, τα σχόλια για αυτό το άρθρο είναι κλειστά.



^
Top
css.php