【问题标题】:Displaying and Randomising php Arrays显示和随机化 php 数组
【发布时间】:2013-12-09 11:23:14
【问题描述】:

我有一个数组显示结果如下:

Array
(
    [0] => 71
    [1] => 56
    [2] => 64
    [3] => 82
    [4] => 90
    [5] => 80
    [6] => 65
    [7] => 62
    [8] => 14
    [9] => 3
)

我的代码是:

while($row = mysql_fetch_assoc($result))
{   

  $show[] = $row['number'];

}
   echo '<pre>'; print_r($show);

如何随机化数组内容并将它们显示为 5 位数字,例如:g 71 64 14 80 82

【问题讨论】:

  • 你是如何得出结果的71 64 14 80 82
  • 不,我得到的结果如上图所示

标签: php mysql arrays


【解决方案1】:
$rand5 = array_rand(array_flip($show), 5);
// we need array_flip because array_rand returns the keys

http://php.net/array_rand

http://php.net/array_flip

【讨论】:

  • 会显示71 64 14 80 82 吗?
  • 它是随机的,所以 .. 有时 :D
【解决方案2】:

我会使用shuffle 来随机化数组,根据获取数组的 5 个元素,这真的取决于你的需要,你到底想要完成什么,获取前 5 个元素,最后一个元素,或其他一些逻辑。

【讨论】:

【解决方案3】:

试试这个:

$arr=array();
for ($i=0;$i<5;$i++)
{
$arr[i]=$items[array_rand($items)];
}

$arr 包含结果

【讨论】:

    【解决方案4】:

    不确定得到这个的查询,但你也可以使用

    SELECT number
    FROM SomeTable
    ORDER BY RAND()
    LIMIT 5
    

    但是请注意,ORDER BY RAND() 效率很低,因此仅适用于处理少量行的情况。但是,如果您要带回大量行,那么在 PHP 中执行此操作也会效率低下。

    有更有效的方法可以返回单个随机行,因此如果您有大量行,则值得使用有效地检索单行 5 次并将结果合并在一起(尽管您需要考虑随机行可能重复的可能性。

    例如(并对此不太满意):-

    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    UNION
    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    UNION
    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    UNION
    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    UNION
    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    UNION
    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    UNION
    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    UNION
    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    UNION
    (SELECT r1.number
    FROM SomeTable AS r1 
    INNER JOIN 
    (
        SELECT RAND( ) * ( MAX( number ) - MIN( number ) ) + MIN( number ) AS number
        FROM SomeTable
    ) AS r2
    ON r1.number >= r2.number
    ORDER BY r1.number ASC
    LIMIT 1)
    LIMIT 5
    

    这里的 SQL 小提琴:-

    http://sqlfiddle.com/#!2/14caa/4

    这是获取 10 个随机行,然后再使用 LIMIT 5 只获取 5 行。当然,这可能不会得到 5 行的可能性仍然很小(不太可能,但是这些联合查询中的每一个都可能返回同一行)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2015-10-15
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多