2010-01-04 58 views
1

Im循環遍歷一些XML節點,並說我有1到200個這些節點。如何從一個循環中抓取一組「隨機」項目php

我如何「隨機」選擇最多10個這些節點。它必須爲大多數十個,但少至1

這是林與現在的工作......

 $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++; 
     } 

困難的是,我不知道有多少我都會有,但希望從中選擇我的「隨機」10的游泳池來自整體,但是很多都存在。

回答

5
$randomPool = array_rand ($butters->users->user, 10); 
+2

我不認爲這會工作,這取決於他使用的是什麼XML模塊,因爲array_rand需要數組作爲第一項,但是如果您使用DOM,$ butters-> users-> user可能是DOMNODE :: ELEMENT_LIST模塊。 雖然 – Psytronic 2010-01-04 08:56:37

+0

可能是錯誤的foreach上的工作也會對array_rand()也有效, 假設Patrick給出的示例沒有輸出錯誤。 – lamas 2010-01-04 09:01:07

+0

聽起來好像帕特里克想要10作爲隨機元素的上限,所以你應該傳遞一個1到10之間的隨機數作爲array_rand的第二個參數,然後你將得到一個隨機的一組節點,長度在1到10 – 2010-01-04 09:05:39

0

創建一個隨機對象(不知道PHP的具體代碼),然後調用它並與10 /(集合中的總數)進行比較。這意味着你理論上應該選擇10%,但它可能會更少,並且你現有的代碼會阻止它選擇更多。

3

我會得到10個隨機索引,然後遍歷這些並獲取節點。

 

$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 
} 

您需要添加一個檢查以確保在將其添加到$ indexes數組中時尚未獲得索引。

你可以把這個變成一個命令,但是你可以用重複的(不太可能取決於元素的量,但可能最終會...

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

假設你正在使用的SimpleXML,你。可以使用一個XPath讓所有的用戶,這將返回一個數組,並從它應該是蛋糕

像這樣的東西應該做的:

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

雖然有人可能想糾正我在Xpath上。從內存

2

把所有的用戶在一個陣列,將它洗和搶前十項:

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

也許你可以用$users = (array) $butters->users->user縮短第一步。

相關問題