我想从MySQL数据库生成随机文章,结果有5篇不同的文章。我尝试使用preg_match()。
$random_post = 5;
$unique_number = "";
do {
$random_post--;
$rand_id = rand($min_range, $max_range);
$unique_number .= " ".$rand_id;
if (!preg_match("/$rand_id/", $unique_number)) {
get_article($rand_id);
}
} while ($random_post);
我也尝试使用strpos()。
$random_post = 5;
$unique_number = "";
do {
$random_post--;
$rand_id = rand($min_range, $max_range);
$unique_number .= " ".$rand_id;
if (strpos($unique_number, $rand_id) === false) {
get_article($rand_id);
}
} while ($random_post);
但仍然生成相同的随机数。喜欢2 6 12 2 6,13 9 13 3 3 11 13 13 12 11.我认为我使用的功能不正确或代码流中有错误。
答案 0 :(得分:2)
您在检查结果是否重复之前,会在结果中添加新号码。因此,您的if
条件将始终为假,并且您永远不会收到您的文章。
将这些行移到if
块中:
$random_post--;
$unique_number .= " ".$rand_id;
答案 1 :(得分:1)
是否必须通过PHP完成?您可以使用SQL执行类似的操作:
SELECT your, things FROM table ORDER BY RAND() LIMIT 5
选择5个不同的条目,从不相同的两次
答案 2 :(得分:0)
为什么使用字符串来保存这些数据?我建议一个阵列:
$random_post = 5;
$unique_number = array();
do {
$rand_id = rand($min_range, $max_range);
if (!in_array($rand_id, $unique_number)) {
get_article($rand_id);
$unique_number[] = $rand_id;
$random_post--;
}
} while ($random_post);
如果你需要一个由这些数字组成的字符串用于其他目的,你可以使用implode:
$unique_string = implode(" ", $unique_number);
答案 3 :(得分:0)
试试这个:它只会使用rand
所需的次数。
//Create an array with available range
$items = range($min_range, $max_range);
//Number of posts
$posts = 5
//Final list
$answer = array();
for($x = 0; $x < 5; $x++) {
//Generate a random number from 0 to number of items available in the array
$rand = rand(0, count($items) - 1);
//Get the item at the given random position
$answer[] = $items[$rand];
//Remove the used item from the array
array_splice($items, $rand, 1);
}
以上示例仅生成5个随机数,它将为您提供所需的ID。
答案 4 :(得分:0)
简短的脚本:
$ids = range($min, $max);
shuffle($ids);
foreach(array_slice($ids, 0, $random_post) as $id)
get_article($id);
如果您有很多文章,我会使用类似
的内容$ids = array();
while(count($ids) < $random_post)
{
$id = rand($min, $max);
if(!isset($ids[$id))
get_article($ids[$id] = $id);
}