使用随机行数据将随机结果集数组填充到规定的 LIMIT

问题描述 投票:0回答:2
$sql = "SELECT * FROM banner ORDER BY RAND() LIMIT 6";
$x = 1;
            
while ($result =mysql_fetch_assoc($banner_arr))
{
    //print_r($result);
    $response["banner_image_" . $x] = //something
    $x++;
}

如果数据库返回的数据少于6条,我想重复响应数组中的数据。假设它返回 5 个数据,那么我想返回包含 5 个数据的响应数组,并再次从数据库返回的 5 个数据中随机选择一个。基本上总共有 6 个数据。我怎样才能做到这一点?

php arrays random limit resultset
2个回答
1
投票

试试这个:

$DESIRED_SIZE = 6;
$sql = "SELECT * FROM banner ORDER BY RAND() LIMIT $DESIRED_SIZE";

// TODO read from db, store into $rows array

$rows = [["1", "banner1"], ["2", "banner2"], ["3", "banner3"], ["4", "banner4"]];
$banners = [];
while (count($banners) < $DESIRED_SIZE) {
    $banners = array_merge($banners, $rows);
}
shuffle($banners);
$result = array_slice($banners, 0, $DESIRED_SIZE);

0
投票

要填充结果集,该结果集用结果集中的随机项目填充以达到指示的限制并且确保随机选择的项目的均匀分布并且避免在查询没有结果时出现无限循环,请尝试以下操作脚本。

通过不断扩展循环内的

$pool
变量,有可能减少所需循环的数量。

代码:(PHPize演示

$sql = <<<SQL
SELECT *
FROM banner
ORDER BY RAND()
LIMIT ?
SQL;
$limit = 8;
$result = $mysqli
    ->execute_query($sql, [$limit])
    ->fetch_all(MYSQLI_ASSOC);

while (($count = count($result)) < $limit) {
    $pool = $result;
    shuffle($pool);
    array_push(
        $result,
        ...array_slice($pool, 0, $limit - $count)
    );
}
var_export($result);

对于包含以下内容的数据库表:

(1, 'Banner A'),
(2, 'Banner B'),
(3, 'Banner C');

PHP 将返回:

array (
  0 => 
  array (
    'id' => 2,
    'name' => 'Banner B',
  ),
  1 => 
  array (
    'id' => 1,
    'name' => 'Banner A',
  ),
  2 => 
  array (
    'id' => 3,
    'name' => 'Banner C',
  ),
  3 => 
  array (
    'id' => 1,
    'name' => 'Banner A',
  ),
  4 => 
  array (
    'id' => 2,
    'name' => 'Banner B',
  ),
  5 => 
  array (
    'id' => 3,
    'name' => 'Banner C',
  ),
  6 => 
  array (
    'id' => 3,
    'name' => 'Banner C',
  ),
  7 => 
  array (
    'id' => 1,
    'name' => 'Banner A',
  ),
)

如果您需要这些自定义一级键,请在

while()
循环后使用以下命令。

var_export(
    array_combine(
        substr_replace(
            range(1, $count),
            'banner_image_',
            0,
            0
        ),
        $result
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.