1

I have 60 images but I want to randomly show 20 from 1 to 60.

My code is something like this, it shows 60

<?php
  for( $i = 1; $i < 61; $i++ ) 
    { 
       print '<a href="javascript:;"><img src="images/items/' . $i . '.png"  class="allitems item' . $i . '" /></a>'; 
    }    
?>

I found PHP function RAND(), but unable to implement, any help would be appreciated.

1

1 Answer 1

11

Try functions range() and array_rand():

<?php
// range generates array with direct sequence from 1 to 60 (inclusive).
// array_rand extracts 20 random keys from it.
$range = array_rand(range(1, 60), 20);

while(count($range)){
    $i = array_shift($range) + 1;

    print '<a href="javascript:;"><img src="images/items/' . $i . '.png"  class="allitems item' . $i . '" /></a>';
}
?>

UPDv1: With for-loop:

<?php
$range = array_rand(range(1, 60), 20);

for($i = 0; $i < 20; $i++){
    $image = $range[$i] + 1;

    print '<a href="javascript:;"><img src="images/items/' . $image . '.png"  class="allitems item' . $image . '" /></a>';
}

unset($range, $i, $image);
?>

UPDv2:

I've misread array_rand()s manual. It returns array keys instead of elements. Here is multipurpose version (fix with array_flip()):

<?php
header('Content-Type: text/plain');

$buffer = range(1, 60);
$buffer = array_flip($buffer);
$buffer = array_rand($buffer, 20);

foreach($buffer as $value){
    echo $value, PHP_EOL;
}
?>

And a shortcut function (negatives safe, and overall count safe):

<?php
header('Content-Type: text/plain');

function random_range($min, $max, $count){
    $count = abs((int)$count);

    if($min > $max){
        list($min, $max) = array($max, $min);
    }

    $uniques = abs($max - $min);

    if($count > $uniques)$count = $uniques;

    return array_rand(array_flip(range($min, $max)), $count);
}

foreach(random_range(1, 60, 20) as $value){
    echo $value, PHP_EOL;
}
?>

There is another way for those, who needs non-growing random sequence. Use this:

<?php
header('Content-Type: text/plain');

function random_range($min, $max, $count){
    $count = abs((int)$count);

    if($min > $max){
        list($min, $max) = array($max, $min);
    }

    $uniques = abs($max - $min);

    if($count > $uniques)$count = $uniques;

    $result = array();
    $ready  = 0;

    while($ready < $count){
        $buffer = rand($min, $max);

        if(!in_array($buffer, $result)){
            $result[] = $buffer;
            $ready++;
        }
    }

    return $result;
}

foreach(random_range(1, 60, 20) as $value){
    echo $value, PHP_EOL;
}
?>

UPDv3:

Another way, used range() + shuffle() + array_slice():

<?php
header('Content-Type: text/plain');

function random_range($min, $max, $count){
    $count = abs((int)$count);

    if($min > $max){
        list($min, $max) = array($max, $min);
    }

    $uniques = abs($max - $min);

    if($count > $uniques)$count = $uniques;

    $result = range($min, $max);
    shuffle($result);

    return array_slice($result, 0, $count);
}

foreach(random_range(5, 20, 5) as $random){
    echo $random, ' ';
}
?>
Sign up to request clarification or add additional context in comments.

10 Comments

A decent efficient answer. ^^
I'd loop over the values with a regular loop instead of a while..count..array_shift...
@deceze I'll fix... It makes sense.
The first one no.. The update, well, that just selects the first 20 images. lol. =P EDIT he fixed the update and the second part now ^^
foreach (array_rand(range(1, 60), 20) as $image) ... anyone?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.