2012-09-21 152 views
0

如何可以隨機選擇一組行如何選擇一組隨機的行?

重要的位:

  1. 我需要指定隨機的行數通過一個變量來選擇。
  2. 舉例說我想選擇的行數是10,那麼它HAS TO select 10 不同的行。我不希望它挑出相同的行幾次,直到它有10個。

下面的代碼挑出1個隨機行,我怎麼才能定製這個以上規格?

<?php $rows = get_field('repeater_field_name'); 
$row_count = count($rows); 
$i = rand(0, $row_count - 1); 

echo $rows[$i]['sub_field_name']; ?> 
+0

這個話題可能是使用對你有用。 http://stackoverflow.com/questions/3003192/five-unique-random-numbers-from-a-subset – luso

回答

2
<?php 
    $rows = get_field('repeater_field_name'); 
    $row_count = count($rows); 
    $rand_rows = array(); 

    for ($i = 0; $i < min($row_count, 10); $i++) { 
     // Find an index we haven't used already (FYI - this will not scale 
     // well for large $row_count...) 
     $r = rand(0, $row_count - 1); 
     while (array_search($r, $rand_rows) !== false) { 
      $r = rand(0, $row_count - 1); 
     } 
     $rand_rows[] = $r; 

     echo $rows[$r]['sub_field_name']; 
    } 
?> 

這是一個更好的實現:

<? 
$rows_i_want = 10; 
$rows = get_field('repeater_field_name'); 

// Pull out 10 random rows 
$rand = array_rand($rows, min(count($rows), $rows_i_want)); 

// Shuffle the array 
shuffle($rand);                              

foreach ($rand as $row) { 
    echo $rows[$row]['sub_field_name']; 
} 
?> 
+0

比我的答案更好,'min'位非常好。 –

+0

@SeanBright謝謝,好像非常接近工作。有幾次它選擇了同一行......有一次它甚至選擇了同一行三次。 – Rob

+0

你有多行具有相同的'sub_field_name'? –

0

簡單地循環遍歷隨機行處理您想要獲得的隨機行數。

<?php 
$rows_to_get=10; 
$rows = get_field('repeater_field_name'); 
$row_count = count($rows); 
$x=0 
while($x<$rows_to_get){ 
    echo $rows[rand(0, $row_count - 1)]['sub_field_name']; 
    $x++; 
} 
?> 
0

你可以試試這個

$rows = get_field('repeater_field_name'); 
var_dump(__myRand($rows, 10)); 

function __myRand($rows, $total = 1) { 
    $rowCount = count($rows); 
    $output = array(); 
    $x = 0; 
    $i = mt_rand(0, $rowCount - 1); 

    while ($x < $total) { 
     if (array_key_exists($i, $output)) { 
      $i = mt_rand(0, $rowCount - 1); 
     } else { 
      $output[$i] = $rows[$i]['sub_field_name']; 
      $x ++; 
     } 
    } 
    return $output ; 
} 
0

一個簡單的辦法:

$rows = get_field('repeater_field_name'); 
$limit = 10; 

// build new array 
$data = array(); 
foreach ($rows as $r) { $data[] = $r['sub_field_name']; } 
shuffle($data); 
$data = array_slice($data, 0, min(count($data), $limit)); 

foreach ($data as $val) { 
    // do what you want 
    echo $val; 
}