2013-05-28 5 views
0

У меня есть запрос, из которого мне нужно принимать случайные значения (случайные строки) и ограничивать, скажем, 5 результатов и вычитать их из основного массива (запроса). Как я могу это сделать?Codeigniter 2.1, PHP - получить случайный массив из пары значений ключа

Это функция запроса:

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; 
    } 

ответ

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] - это массив, содержащий случайные строки.

+0

Этого не будет. Мне нужны все результаты запроса. На странице просмотра у меня есть две части: одна для случайных результатов запроса, а остальная часть для остальных. – Sasha

+0

Саша, я понимаю. 'один для случайных результатов запроса, а остальное для остальных'. Не могли бы Вы уточнить? – manix

+0

Ooops, мой плохой. Это так: на странице у меня две части, одна часть для случайных значений, взятых из исходного массива (запрос), а другая часть на странице - для запроса минус случайные значения (небольшая галерея с 5 результатами и большая галерея с остальной частью запроса). – Sasha

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(); 
} 
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; 
         } 
        } 
    } 
    

Теперь у вас есть 5 уникальное случайное число в $random_integer, в пределах вашего возвращенного результата. Если из запроса возвращено менее 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 будет содержать остальные запросы.

Смежные вопросы