Burak Buldu

O bir Teknoloji KurduGalatasaray taraftarıIT ProfesyoneliAntalyalı

Diziyi, Zamana Bağlı Karıştırarak Listeleme

Merhaba arkadaşlar, uzun bir süre yeni bir içerik eklememiştim. Yoğun bir bahar dönemi geçti. İş yerindeki projeler, yüksek lisans ve araya bir de askerlik sığdırdığım bir dönemdi.

Dinamik içerik ihtiyacı sebebiyle bir dizinin belirli sayıda elemanını karışık şekilde sıralamak ve bunu belirli bir periyotta gerçekleşmesini istiyordum. İnternette örnek de çok aradım ama bulamadım. Sonra dedim ki, o zaman ben yapayım.

Şimdi bu işin C# ve PHP‘de nasıl yapılabileceğine bakalım. İlk önce dizimizi belirleyelim.

Dizimiz “eleman 1″, ” eleman 2″,” eleman 3″,” eleman 4″,” eleman 5″,” eleman 6″,” eleman 7″ ,” eleman 8″ ,” eleman 9″ şeklinde 9 tane elemandan oluşsun. Bu elemanlardan 4 tanesi, her 10 saniyede farklı şekilde sıralanacak olsun. Eğer İlk olarak C# kodunu inceleyelim.

Küçük bir not: Dakika atladığında tekrar ilk 10 saniye yine bir önceki ilk 10 saniye ile aynı sırada gelecektir. Çünkü random için verdiğimiz integer aynı olduğu için aynı sıralama yapacaktır. Bunu değiştirmek ve her zaman farklı sıralamak için, saniyeyi başka zaman periyotlarına göre ayarlamak size kalmış.

     DateTime date = DateTime.Now;
     int sure = date.Minute/10;

     //belirlenen süre değiştikçe rastgele sayıyı değiştirme
     Random rastgele = new Random(sure); // Random sınıfında int kullanırsanız, üretilen değeri sabitler.

     List<string> dizi = new List<string> {"eleman 1", "eleman 2", "eleman 3", "eleman 4", "eleman 5", "eleman 6", "eleman 7" , "eleman 8"  , "eleman 9"};

     //5 tane elemanı listelemek için Take(4) yapıyoruz. OrderBy ise karıştırıcı (Random, Guid gibi...) kullanıldığında rastgele sıralar.

     var yenidizi = dizi.OrderBy(a => rastgele.Next()).Take(4).ToList();

     foreach (string i in yenidizi)
      {
          Console.WriteLine(i);
      }

Şimdi de PHP tarafında aynısı nasıl yapılır ona bakalım.

 $dizi = array("eleman 1", "eleman 2", "eleman 3", "eleman 4", "eleman 5", "eleman 6", "eleman 7" , "eleman 8"  , "eleman 9");

// karıştırma süremizi belirliyoruz
$sure = date('s')/10;
$sure = (int)$sure;

// PHP tarafında fixlemek için mt_srand(int) kullanıyoruz
mt_srand($sure);

//dizinin tüm elemanlarını rastgele değerlerle işaretliyoruz bunun için array_map fonksiyonu iş görüyor
$yenidizi = array_map(create_function("","return mt_rand();"), range(1, count($dizi)));

//dizimizi array_multisort fonksiyonu ile tekrar oluşturulan işaretlere göre sıralıyoruz
array_multisort($yenidizi, $dizi);

for ($i=0;$i<4;$i++) //elemanları listeliyoruz
{  
    echo $dizi[$i];
    echo "</br>"; //alt satır
}

Dinamik bir liste yakalamak için güzel bir çözüm olduğunu düşünüyorum. Tekrardan belirtmek isterim ki, karıştırma zamanını size kalmış. Ben haftalık olarak karıştırmak için hafta numarasını da alabildiğim başka bir fonksiyonla zenginleştirmiştim. Kolay gelsin…

Paylaş