PHP Heterojen Sıralama Algoritması
Okulda bulunan mevcut 48 sınıfın her notlara göre eşit kontenjanda dağılımı yapmak isterken. EXCEL ile basit bir şekilde yapabilirim diye düşündüm ettim bunu ama düşündüğüm gibi olmadı. EXCEL ’deki sıralama türleri şöyleydi, A’dan Z’ye, Z’den A’ya, Küçükten Büyüğe ve Büyükten Küçüğe sıralama şeklinde sıralama özelliği vardı. Bunlar işime yaramadı tabi çünkü kurumun benden isteği her sınıfta tembel öğrenci de olacak çalışkan öğrencide olacak ve sayıları eşit olacak her sınıf birbirine benzeyecekti. Excel ‘den bir sonuç alamayınca PHP de yapayım dedim ve şu şekilde yapmaya başladım.
- Tüm öğrencileri bir ARRAY içine yerleştirdim.
- Daha sonra kuralları birer birer değişkenlerde tanımladım.
- $ogrenci_sayisi = 1200;
- $sinif_kontenjani = 25;
- Bu işlemden sonra öğrencileri gruplandırma fonksiyonu yazdım. Açıklamak gerekirse; Öğrencilerin not ortalaması aralığı 0 – 100 arasındaydı. Bende şu şekilde beş grup oluşturup SWİTCH-CASE ile her öğrenciye grup değerini atadım.
- 0 – 19 = 1. Grup
- 20 – 39 = 2. Grup
- 40 – 59 = 3. Grup
- 60 – 79 = 4. Grup
- 80 – 100 = 5. Grup
- Bu işlemden sonra yeni bir boş ARRAY tanımlayıp, döngümü hazırlamaya başladım.
Kod kısmına geçelim;
Öncelikle öğrenciler.php adında bir dosya oluşturup içine for ile rastgele 1200 öğrenci oluşturdum. PHP rand fonksiyonu ile rastgele her öğrenciye 0 – 100 arasında bir not verdim. Daha sonra bunları dizi haline getirdim. Sonra yazdığım fonksiyon dosyasından sıralamayı yaptım.
Fonksiyon kodlarımızı inceleyelim;
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
Bu konu için paylaşılan kod parçası : Ctrl + C ile kopyalayın! <?php /* $ogrenciler = array( 0 => array(“ogrenci_no” => 1,”isim_soyisim” => “rastgele_1 isim_1″,”not_ortalama” => 17, “grup” => “”, “yeni_sinif” => “”), 1 => array(“ogrenci_no” => 2,”isim_soyisim” => “rastgele_2 isim_2″,”not_ortalama” => 48, “grup” => “”, “yeni_sinif” => “”), 2 => array(“ogrenci_no” => 3,”isim_soyisim” => “rastgele_3 isim_3″,”not_ortalama” => 91, “grup” => “”, “yeni_sinif” => “”), …………………………………………………………………………………………………………… …………………………………………………………………………………………………………… …………………………………………………………………………………………………………… 1197 => array(“ogrenci_no” => 1198,”isim_soyisim” => “rastgele_1198 isim_1198″,”not_ortalama” => 4, “grup” => “”, “yeni_sinif” => “”), 1198 => array(“ogrenci_no” => 1199,”isim_soyisim” => “rastgele_1199 isim_1199″,”not_ortalama” => 72, “grup” => “”, “yeni_sinif” => “”), 1199 => array(“ogrenci_no” => 1200,”isim_soyisim” => “rastgele_1200 isim_1200″,”not_ortalama” => 11, “grup” => “”, “yeni_sinif” => “”) ); */ include(‘ogrenciler.php’); // yukardaki örnekteki gibi ayarladığımız öğrencilerimiz dizisinin dosyasını çağırıyoruz $ogrenci_sayisi = count($ogrenciler); $sinif_kontenjani = 25; $sinif_sayisi = 48; $limit = array(1 => 1, 2 => 1, 3 => 1, 4 => 1, 5 => 1); $mevcut = array(); $son_sinif = 1; for($i = 1; $i <= $sinif_sayisi; $i++) { $mevcut[$i] = 0; // ilk durumdaki sınıf mevcudu } for($i = 0; $i < $ogrenci_sayisi; $i++) { switch(true) { case $ogrenciler[$i]['not_ortalama'] >= 80 : $ogrenciler[$i]['grup'] = 5; break; case $ogrenciler[$i]['not_ortalama'] >= 60 : $ogrenciler[$i]['grup'] = 4; break; case $ogrenciler[$i]['not_ortalama'] >= 40 : $ogrenciler[$i]['grup'] = 3; break; case $ogrenciler[$i]['not_ortalama'] >= 20 : $ogrenciler[$i]['grup'] = 2; break; case $ogrenciler[$i]['not_ortalama'] >= 0 : $ogrenciler[$i]['grup'] = 1; break; } $limit[$ogrenciler[$i]['grup']] -= $limit[$ogrenciler[$i]['grup']] == $sinif_sayisi ? $sinif_sayisi – 1 : 0; $son_sinif = $limit[$ogrenciler[$i]['grup']]; $limit[$ogrenciler[$i]['grup']] += $mevcut[$son_sinif] == $sinif_kontenjani ? 1 : 0; $mevcut[$limit[$ogrenciler[$i]['grup']]]++; /* Bu aşamadan sonra eğer veritabanıyla işlem yapıyorsanız bu kısımdan sonra aşağıda değişkene atadığım gibi Veritabanından da güncelleme yapabilirsiniz. */ $ogrenciler[$i]['yeni_sinif'] = $limit[$ogrenciler[$i]['grup']]; } ?> |