2010-01-04 40 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缩短第一步。

相关问题