如何在symfony控制器内洗牌?

时间:2014-04-16 08:19:13

标签: arrays symfony doctrine-orm

我需要一个从数据库中显示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 %}

4 个答案:

答案 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)

来自PHP: array_rand

  

当只选择一个条目时,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));
}