"rasgele" kapmak için nasıl

5 Cevap

Im bazı XML düğümleri arasında döngü ve ben 1 arasında ve bu düğümlerin 200 söylüyorlar.

Nasıl "rastgele" bu düğümlerin maksimum 10 seçebilirsiniz. Çoğu onlu olarak olmak zorundadır, ancak 1 gibi az.

Bu im şimdi çalışıyor ne ...

        $i = 0;
        foreach ($butters->users->user as $user) {
            if($i==10) break;
            $id = $user->id;
            $name = $user->screen_name;
            $profimg = $user->profile_image_url;
            echo "things";
            $i++;
        } 

Zorluk i olacak kaç bilmiyorum, ama ancak çok mevcut bütünlüğü uzakta olmak benim "rastgele" 10 seçmek hangi havuz istiyorum olmasıdır.

5 Cevap

Ben o aracılığıyla sonra 10 rastgele endeksleri, loop almak ve düğümleri olsun istiyorum.


$indexes = array();
for($i = 0; $i< 10; $i++){
  $indexes[] = rand(0, $butters->users->length);
}

foreach($indexes as $index){
  $user = $butters->users->item($index);
  //do whatever with $user
}

Eğer $ indeksler dizi eklediğinizde zaten endeksi var değil emin olmak için bir kontrol eklemeniz gerekir.

Sen ancak olası elemanların miktarına bağlı olarak (çiftleri ile sonuna kadar, ama mümkün olabilir, bir komutta bu koyabilirsiniz ...

for($i = 0; $i< 10; $i++){
  $user = $butters->users->item(rand(0, $butters->users->length));
  //do something with $user
}

Bir dizideki tüm kullanıcıları koymak, onu shuffle ve ilk on öğeler yakala:

$users = array[];
foreach ($butters->users->user as $user) {
    $users[] = &$user;
}
shuffle($users);
$tenRandomUsers = array_slice($users, 0, 10);

Belki de sadece $users = (array) $butters->users->user ile ilk adımı kısaltabilir.

Rastgele bir nesne (PHP özel kodu bilmiyorum) sonra onu aramak ve 10 / (sette toplam) ile karşılaştırmak oluşturun. Bu teoride, ancak daha az olabilir,% 10 seçmelisiniz anlamına gelir, ve heyecan verici kod daha seçerek onu durdurur.

Eğer SimpleXML kullanarak varsayarak, tüm kullanıcıları almak için XPath kullanabilirsiniz. Bu pasta olması gerektiği bir dizi ve dönecektir.

Böyle bir şey yapmanız gerekir:

$users  = $xml->xpath('//butters/users/user');
$random = array_rand($users, 10);

Someone might want to correct me on the Xpath though. Doing it from memory

Eğer $ kullanıcılar için garip öz uygulanan veri yapısı çeşit varsa Reservior örnekleme kullanmak isteyebilirsiniz - http://stackoverflow.com/questions/54059/efficiently-selecting-a-set-of-random-elements-from-a-linked-list