Created
July 2, 2010 10:44
-
-
Save gdemir/461204 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Yerleştirme planımız. | |
function plan() { | |
return array( | |
'mühendislik' => array( | |
'salonlar' => array( | |
'a101' => array( | |
'kapasite' => 1, | |
), | |
'a102' => array( | |
'kapasite' => 3, | |
), | |
), | |
), | |
'fenedebiyat' => array( | |
'salonlar' => array( | |
'a302' => array( | |
'kapasite' => 2, | |
), | |
'a303' => array( | |
'kapasite' => 4, | |
), | |
), | |
), | |
); | |
} | |
// Plandan yararlanarak düz bir liste hazırla, yerler listesi. | |
function yerler($varsayilan_kapasite=20) { | |
$yerler = array(); | |
foreach (plan() as $bina => $b) { | |
foreach ($b['salonlar'] as $salon => $s) { | |
array_push($yerler, array( | |
'bina' => $bina, | |
'salon' => $salon, | |
'kapasite' => array_key_exists('kapasite', $s) ? $s['kapasite'] : $varsayilan_kapasite, | |
'atanan' => 0, | |
)); | |
} | |
} | |
return $yerler; | |
} | |
// Kayıt sırasında girilen isimlerdeki tutarsızlığı önle. | |
// İlk harfler büyük olmalı. Unutmayalım kimlik basacağız. | |
function ucname($name) { | |
return ucwords(strtolower($name)); | |
} | |
// Verilen yerler listesinde boş bir yer bul ve dön. Bu işlev bir dizi | |
// referansı alıyor (& işlecine dikkat). Yani dizinin kopyası değil | |
// işaretçisi. Neden? Çünkü bu dizide değişiklik yapacağız. | |
function yerver(&$yerler) { | |
static $yerno = 0; // her çağrıda değerini koruyan bir indis | |
while (array_key_exists($yerno, $yerler)) { | |
if ($yerler[$yerno]['atanan'] < $yerler[$yerno]['kapasite']) { | |
$yer = $yerler[$yerno]; | |
break; | |
} | |
++$yerno; | |
} | |
if (isset($yer)) { | |
++$yerler[$yerno]['atanan']; // referans burada gerekli | |
return $yer; | |
} | |
} | |
// Atama işlemi için özel bir işlev. Stil olarak dışarıdan çağrılmaması | |
// gereken bu tür özel amaçlı işlev isimlerini alt çizgi ile başlatıyoruz. | |
function _atandi($kayit, $yer) { | |
echo "ataması yapılan kayıt\n"; | |
$yervarmi = isset($yer); | |
if ($yervarmi) { | |
$kayit['ad'] = ucname($kayit['ad']); | |
$kayit['soyad'] = ucname($kayit['soyad']); | |
$kayit['bina'] = $yer['bina']; | |
$kayit['salon'] = $yer['salon']; | |
$kayit['sıra'] = $yer['atanan'] + 1; | |
} | |
else | |
echo("verilecek yer kalmadı\n"); | |
print_r($kayit); // debug amaçlı | |
if (! $yervarmi) exit("çıkıyorum\n"); | |
return $kayit; | |
} | |
// Atama yap. | |
function ata($kayitlar) { | |
$atamalar = array(); | |
$yerler = yerler(); | |
foreach ($kayitlar as $kayit) { | |
array_push($atamalar, | |
_atandi( | |
$kayit, | |
yerver($yerler) | |
) | |
); | |
} | |
return $atamalar; | |
} | |
// Deneme sürüşü. | |
function dene() { | |
// bu kayıtlar veritabanından gelecek | |
$kayitlar = array( | |
array( | |
'ad' => 'ABUzEr', | |
'soyad' => 'kAdayıf', | |
'tcno' => 1234567912, | |
), | |
array( | |
'ad' => 'satılmış', | |
'soyad' => 'ÖkkEŞ', | |
'tcno' => 1234567913, | |
), | |
array( | |
'ad' => 'Ali', | |
'soyad' => 'Veli', | |
'tcno' => 1234567914, | |
), | |
array( | |
'ad' => 'recai', | |
'soyad' => 'oktaş', | |
'tcno' => 1234567919, | |
), | |
array( | |
'ad' => 'gökhan', | |
'soyad' => 'demir', | |
'tcno' => 2234567919, | |
), | |
array( | |
'ad' => 'emre can', | |
'soyad' => 'yılmaz', | |
'tcno' => 3234567919, | |
), | |
array( | |
'ad' => 'can', | |
'soyad' => 'kurnaz', | |
'tcno' => 4234567919, | |
), | |
array( | |
'ad' => 'emin', | |
'soyad' => 'eker', | |
'tcno' => 4236567919, | |
), | |
array( | |
'ad' => 'zafer', | |
'soyad' => 'amanvermez', | |
'tcno' => 5236567919, | |
), | |
); | |
// önce sira no verelim, bunu mysql otomatik veriyor | |
$i = 2; | |
foreach (array_keys($kayitlar) as $index) { | |
$kayitlar[$index]['id'] = sprintf("%06d", $i++); | |
} | |
// atama yap ve sonucu görüntüle | |
print_r(ata($kayitlar)); | |
} | |
dene(); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment