0

我有查询,我需要从中获取随机值(随机行)并限制为 5 个结果,然后从主数组(查询)中减去它们。我怎样才能做到这一点?

这是查询功能:

public function galerija_jedna_slike()
    {
        $galerija = $this->db->order_by('id_galerija', 'RANDOM')->limit(1)->get($this->table)->row();
        $q = " SELECT * FROM galerija_slike
                LEFT JOIN galerije
                ON galerija_slike.galerija_id = galerije.id_galerija
                WHERE galerija_id = $galerija->id_galerija ";
        return $this->db->query($q)->result_array();
    }

我设法获得了随机值,现在我需要从主数组中删除这些值。功能:

function array_random_assoc($arr, $num = 1) {
        $keys = array_keys($arr);
        shuffle($keys);

        $r = array();
        for ($i = 0; $i < $num; $i++) {
        $r[$keys[$i]] = $arr[$keys[$i]];
        }
        return $r;
    }
4

3 回答 3

1

您的问题可以分 3 部分解决。

  1. 首先是查询。你已经这样做了,我将从那里开始。

  2. 您需要在返回数组的范围内生成 5 个唯一整数。您还必须小心,以防返回的结果少于 5 个。这是代码。

     $random_integer = array();
     for( $i=0; $i<5 && $i<(count($a)-1); $i++){
        while( 1 ){
            $random_value = rand(0, count($a)-1);
            if( in_array($random_value, $random_integer) ){
                continue;
            }
            else{
                $random_integer[] = $random_value;
                break;
           }
        }
     }
    

现在您在$random_integer返回结果的范围内有 5 个唯一的随机整数。如果查询返回的条目少于 6 个,则 1 将用于正常发布,其余将用于随机发布。您可以在 for 循环的条件下更改它。in_array将检查任何重复的条目。

  1. 最后一部分是将这些随机查询设置在一个单独的变量中,并将它们从主查询中截断。你可以这样做。说,返回的查询是$main_query

        foreach( $random_integer as $row ){
            $random_query[] = $main_query[$row];
            unset($main_query[$row]);
        }
        $main_query = array_values($main_query);
    

unset不会更改数组键。array_values函数将规范化数组键。现在$random_query将包含 5(最大)个随机查询,$main_query并将包含其余查询。

于 2013-05-28T20:50:01.047 回答
1

加载整个表:

$gallery =  $this->db->query("SELECT * FROM gallery;");

让我们从图库中选择五个随机行:

$max_items = 5;
$num = $query->num_rows();
$row = $query->row(rand(0, $num - 1));
$minus = array(); //store the ids to include

for ($i = 0; $i < $max_items; $i ++)
    $minus[] = $gallery ->row(rand(0, $num - 1));

迭代图库以构建两个数组,1.图库减去随机行 2.随机行

$data = array();
foreach ($gallery ->result() as $row)
{
    if (in_array($row->id, $minus))
        $data['random'][] = $row
    else
        $data['gallery'][] = $row
}

现在,该数组$data['gallery']包含没有随机行的所有项目。And$data[random]是一个包含随机行的数组。

于 2013-05-28T19:46:42.743 回答
0

这应该给出一些想法。注意:代码未经测试。

public function galerija_jedna_slike()
{
    $galerija = $this->db->order_by('id_galerija', 'RANDOM')->limit(1)->get($this->table)->row();
    //query to get only id
    $q = "SELECT id FROM galerija_slike WHERE galerija_id = $galerija->id_galerija ";

    $result = $this->db->query($q)->result_array();

    $ids = array();
    foreach($result as $row){
        $ids[] = $row['id'];
    }

    //shuffle id arrays or other function to randomize
    shuffle($ids);

    $ids = array_slice($ids,0,5);//gets first 5 ids

    $sql = " SELECT * FROM galerija_slike
                    LEFT JOIN galerije
                    ON galerija_slike.galerija_id = galerije.id_galerija
                    WHERE galerija_id = $galerija->id_galerija AND id IN(".implode(',', $ids).")";

    return $this->db->query($sql)->result_array();
}
于 2013-05-28T20:21:38.607 回答