我有查询,我需要随机取值(随机行)并限制为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;
}
答案 0 :(得分: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']
包含没有randon行的所有项目。 $data[random]
是一个包含随机行的数组。
答案 1 :(得分:1)
您的问题可以通过3部分解决。
首先是查询。你已经做到了,我将从那里开始。
您需要在返回的数组范围内生成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
将检查是否有任何重复的条目。
最后一部分是在单独的变量中设置这些随机查询,并从主查询中截断它们。你可以这样做。比如说,返回的查询是$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
将包含其余查询。
答案 2 :(得分: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();
}