Skip to content

Instantly share code, notes, and snippets.

@hmert
Created December 8, 2010 21:55
Show Gist options
  • Save hmert/733987 to your computer and use it in GitHub Desktop.
Save hmert/733987 to your computer and use it in GitHub Desktop.
<?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