我需要一个从数据库中显示20个随机图片的页面,但由于不建议对大型表使用RAND()函数,我只是尝试从控制器内的数组中拍摄20个随机值。
这是返回所有图像的工作代码
/**
*@Route("/world/shuffle")
*/
public function shufflepageAction()
{
$images = $this->get('doctrine')->getRepository('GabrielUploadBundle:Image')->findAll();
return $this->render('GabrielLayoutBundle:Worldpage:shuffle.html.twig',array('images'=>$images));
}
现在我需要选择20个结果并将它们洗牌(不起作用)
/**
*@Route("/world/shuffle")
*/
public function shufflepageAction()
{
$images = $this->get('doctrine')->getRepository('GabrielUploadBundle:Image')->findAll();
$simages = array_rand($images,20); //randomize
return $this->render('GabrielLayoutBundle:Worldpage:shuffle.html.twig',array('images'=>$simages));
}
}
由于某种原因它会抛出此错误
无法访问整数变量的属性(“upvotes”) (“1”)在GabrielLayoutBundle:Worldpage:shuffle.html.twig at the line 20
(在第20行,我使用twig上的for循环遍历返回的“images”数组)
// for for循环:
{% for image in images %}
// findstuff
{% endfor %}
答案 0 :(得分:2)
Laurent Wartel是正确的 - 您使用的功能不正确。请尝试使用shuffle
随机化数组的内容。例如:
$a = range(1, 10);
shuffle($a);
print_r($a);
收益率:
Array
(
[0] => 4
[1] => 3
[2] => 9
[3] => 5
[4] => 8
[5] => 7
[6] => 2
[7] => 6
[8] => 10
[9] => 1
)
答案 1 :(得分:1)
当只选择一个条目时,array_rand()返回随机条目的键。否则,返回随机条目的键数组。这样做是为了可以从数组中选择随机键以及随机值。尝试选择比数组中更多的元素将导致E_WARNING级别错误,并且将返回NULL。
$simages
变量是一个包含随机键的数组。因此,您需要将$images
变量赋予视图,然后执行以下操作:
{% for key in simages %}
{{ images[key].upvotes }}
{% endfor %}
答案 2 :(得分:1)
首先在大桌子上调用findAll是个坏主意。
如果您不想使用RAND(),则考虑生成20个随机唯一主键数组,然后使用
执行查询$queryBuilder->andWhere('r.id IN (:ids)')
->setParameter('ids', $ids);
,其中
$ids = array(213, 2131, 33, 982, ...);
答案 3 :(得分:0)
这似乎可以完成这项工作,现在我只需要限制结果
/**
*@Route("/world/shuffle",name="world-shuffle")
*/
public function shufflepageAction()
{
function shuffle_assoc($array)
{
// Initialize
$shuffled_array = array();
// Get array's keys and shuffle them.
$shuffled_keys = array_keys($array);
shuffle($shuffled_keys);
// Create same array, but in shuffled order.
foreach ( $shuffled_keys AS $shuffled_key )
{
$shuffled_array[ $shuffled_key ] = $array[ $shuffled_key ];
}
// Return
return $shuffled_array;
}
$images = $this->get('doctrine')->getRepository('GabrielUploadBundle:Image')->findAll();
$simages = shuffle_assoc($images); //randomize
//ladybug_dump($simages);
//$this->get('ladybug')->log($simages);
return $this->render('GabrielLayoutBundle:Worldpage:shuffle.html.twig',array('images'=>$simages));
}