Avatar billede cyfer Nybegynder
20. december 2004 - 00:09 Der er 37 kommentarer og
1 løsning

Husk de sidste 10 variabler

Hejsa.
Jeg vil bare høre om der er nogen der kan være behjælpelige med at få dette script til at fungere således at:
Den husker de sidste 10 valgte billeder (som den finder random), og hvis det valgte random billede så er et af de sidste 10 valgte billeder, så finder den et nyt random billede.

Altså man vil ikke se det samme billede før 10 billeder senere.

Håber i forstår.
Scriptet det skal indplantes i er at finde her:
http://devcore.dk/source/?code=3

På forhånd mange tak.
Avatar billede coderdk Praktikant
20. december 2004 - 01:09 #1
Hvad med noget i stil med:

<?php

    $antal = 5;

    function getImgArr( $dir )
    {
        $dir = opendir( $dir );
        $arr = array();
        while ( $file = readdir( $dir ) )
        {
            if ( $file[0] != "." )
            {
                $arr[] = $file;
            }
        }

        return shuffle( $arr );
    }

    $arr = getImgArr( "../images/layout_top/" );
    $n = count( $arr );

    if ( $n < $antal )
    {
        die( "Så mange er der ikke" );
    }

    for ( $i = 0; $i < $antal; $i++ )
    {
        echo "<img src='../image/layout_top/" . $arr[$i] . "'><br>";
    }
   
?>
Avatar billede coderdk Praktikant
20. december 2004 - 01:09 #2
echo "<img src='../image/layout_top/" . $arr[$i] . "'><br>";

burde jo være:

echo "<img src='../images/layout_top/" . $arr[$i] . "'><br>";
Avatar billede iss Novice
20. december 2004 - 02:02 #3
Ikke testet, men er det noget som dette du mener:
function getImgArr($dir){
    $dir = opendir($dir);
    $i=0;
    while($file = readdir($dir)){
        if (substr($file,0,1)!=".") {
            $arr[$i] = $file;
            $i++;
        }
    }
    return $arr;
}

function getRndImg($arr, $count = 10){
    if (count($_SESSION['randimd'])>$count) {
        array_shift($_SESSION['randimd']);
    }
    $num = count($arr)-1;
    do {
        $rnd = rand(0,$num);
    } while (in_array($rnd, $_SESSION['randimd']));
    $_SESSION['randimd'][] = $rnd;   
    $str = $arr[$rnd];
    return $str;
}

$ranpic = getRndImg(getImgArr("../images/layout_top/"), 10);


Det er lavet med session, så husk at start session hvis du ikke allerede gør det.
Avatar billede cyfer Nybegynder
20. december 2004 - 13:53 #4
coderdk - dit script virker ikke.. Den skriver bare at der ikke er så mange billeder....
Avatar billede coderdk Praktikant
20. december 2004 - 13:59 #5
Sorry min fejl, shuffle returnerer sand/falsk, skal være:

<?php

    $antal = 5;

    function getImgArr( $dir )
    {
        $dir = opendir( $dir );
        $arr = array();
        while ( $file = readdir( $dir ) )
        {
            if ( $file[0] != "." )
            {
                $arr[] = $file;
            }
        }

        shuffle( $arr );
        return $arr;
    }

    $arr = getImgArr( "../images/layout_top/" );
    $n = count( $arr );

    if ( $n < $antal )
    {
        die( "Så mange er der ikke" );
    }

    for ( $i = 0; $i < $antal; $i++ )
    {
        echo "<img src='../image/layout_top/" . $arr[$i] . "'><br>";
    }
 
?>
Avatar billede cyfer Nybegynder
20. december 2004 - 14:01 #6
iss -> Dit virker heller ikke... Den kommer med billederne ligesom før... Så din funktion hvor at den ikke kan tage det samme billede før 10 billeder efter det sidst blev taget funker ikke... Billederækkefølgen ser fx. sådan her ud med dit script:

layout_top_02.gif
layout_top_08.gif
layout_top_10.gif
layout_top_05.gif
layout_top_08.gif
layout_top_11.gif
layout_top_03.gif
layout_top_12.gif
layout_top_03.gif
......

Allerede ved billede 08 fejler den, og næste gang ved billede 03...  :\
Avatar billede cyfer Nybegynder
20. december 2004 - 14:05 #7
coderdk ->

Warning:  in_array(): Wrong datatype for second argument in /customers/mitdomæne/mitdomæne/httpd.www/minmappe1/minmappe2/picrandom.php on line 21
Avatar billede coderdk Praktikant
20. december 2004 - 14:07 #8
cyfer, Jeg bruger ikke in_array i min kode, så det er ikke min kode der fejler ;)
Avatar billede iss Novice
20. december 2004 - 14:08 #9
cyfer, så har du glemt start session....
Avatar billede cyfer Nybegynder
20. december 2004 - 14:13 #10
coderdk ->
Hmm my bad... Det virker fint... Men jeg tror du har misforstået mit spm.

Den skal ikke spytte 10 billeder ud... Men kun 1!
Det som den skal gøre er bare at huske de forrige 10 billeder den har spyttet ud, så når den spytter et billede ud er det ikke det samme som et af de sidste 10 billeder...

U see?
Avatar billede iss Novice
20. december 2004 - 14:14 #11
Som du kan se, med start session:
Array
(
    [0] => 9
    [1] => 0
    [2] => 7
    [3] => 1
    [4] => 10
    [5] => 4
    [6] => 18
    [7] => 19
    [8] => 11
    [9] => 14
    [10] => 13
    [11] => 5
    [12] => 16
    [13] => 0
    [14] => 2
    [15] => 1
    [16] => 17
    [17] => 12
    [18] => 10
    [19] => 4
    [20] => 14
    [21] => 9
    [22] => 11
    [23] => 13
    [24] => 8
    [25] => 15
    [26] => 3
    [27] => 16
    [28] => 19
    [29] => 17
    [30] => 4
    [31] => 5
    [32] => 12
    [33] => 6
    [34] => 1
    [35] => 11
    [36] => 2
    [37] => 14
    [38] => 0
    [39] => 8
    [40] => 10
    [41] => 17
    [42] => 9
    [43] => 5
    [44] => 4
    [45] => 18
)
Avatar billede coderdk Praktikant
20. december 2004 - 14:20 #12
Nemt at tilpasse ;)

<?php

    session_start();

    function getImgArr( $dir )
    {
        $dir = opendir( $dir );
        $arr = array();
        while ( $file = readdir( $dir ) )
        {
            if ( $file[0] != "." )
            {
                $arr[] = $file;
            }
        }

        shuffle( $arr );
        return $arr;
    }

    if ( !isset( $_SESSION['imgarray'] ) )
    {
      $_SESSION['imgarray'] = getImgArr( "../images/layout_top/" );
    }
    $n = count( $_SESSION['imgarray'] );

    if ( $n > 0 )
    {
      echo "<img src='../image/layout_top/" . array_pop( $_SESSION['imgarray'] ) . "'><br>";
    }
    else
    {
        // Ikke flere billeder
    }

?>

:)
Avatar billede iss Novice
20. december 2004 - 14:22 #13
Så ser man kun de 10 samme billeder i en session.
Avatar billede coderdk Praktikant
20. december 2004 - 14:23 #14
iss, Ved min ser man alle billeder i folderen, indtil der ikke er flere...
Avatar billede iss Novice
20. december 2004 - 14:24 #15
Eller rettere, i samme rækkefølge.
Avatar billede coderdk Praktikant
20. december 2004 - 14:24 #16
Men ok, det var heller ikke det han ville opnå ;) Så bare ignorer mig ;)
Avatar billede coderdk Praktikant
20. december 2004 - 14:25 #17
iss, Ikke forstået? Når jeg opretter arrayet med billeder, smider jeg dem i en tilfældig orden, så to brugere ser dem ikke i samme rækkefølge ;)
Avatar billede iss Novice
20. december 2004 - 14:27 #18
Er der f.eks. 3 billeder:
1, 2, 3 dem trækker du ud, som f.eks. 3, 1, 2 så vil man hvis man henter den siden 9 gange kommer til at være: 3, 1, 2, 3, 1, 2, 3, 1, 2 ikke?
Avatar billede coderdk Praktikant
20. december 2004 - 14:31 #19
iss, nej ved min laver den f.eks. 3, 1, 2, og så kommer der bare ikke flere ;) Som sagt - Ignorér mig bare :D

Det kan dog nemt fixes med:

<?php

    session_start();

    function getImgArr( $dir )
    {
        $dir = opendir( $dir );
        $arr = array();
        while ( $file = readdir( $dir ) )
        {
            if ( $file[0] != "." )
            {
                $arr[] = $file;
            }
        }

        shuffle( $arr );
        return $arr;
    }

    if ( !isset( $_SESSION['imgarray'] ) )
    {
      $_SESSION['imgarray'] = getImgArr( "../images/layout_top/" );
    }
    $n = count( $_SESSION['imgarray'] );
    if ( $n == 0 )
    {
      $_SESSION['imgarray'] = getImgArr( "../images/layout_top/" );
    }

    if ( $n > 0 )
    {
      echo "<img src='../image/layout_top/" . array_pop( $_SESSION['imgarray'] ) . "'><br>";
    }
    else
    {
        // Ikke flere billeder
    }

?>

Så laver den arrayet igen når det er tomt, i en ny rækkefølge ;)
Avatar billede coderdk Praktikant
20. december 2004 - 14:31 #20
Ja så kan

    if ( $n > 0 )
    {
      echo "<img src='../image/layout_top/" . array_pop( $_SESSION['imgarray'] ) . "'><br>";
    }
    else
    {
        // Ikke flere billeder
    }


rettes til

    if ( $n > 0 )
    {
      echo "<img src='../image/layout_top/" . array_pop( $_SESSION['imgarray'] ) . "'><br>";
    }

:)
Avatar billede iss Novice
20. december 2004 - 14:35 #21
Ked af at sige det, men det har min kunne siden kl 2:02:20 :D
Avatar billede cyfer Nybegynder
20. december 2004 - 15:29 #22
My bad igen... iss dit fungerer selvfølgelig perfekt. Det var bare mig der testede det som en dum dør. Jeg har min session start i et andet dokument end jeg testede i.. Tak for hjælpen.

Smid et svar.
Avatar billede iss Novice
20. december 2004 - 15:30 #23
Det hjælper at starte session rigtigt ja:D
Avatar billede cyfer Nybegynder
20. december 2004 - 15:35 #24
Hvis jeg nu vil ændre tallet fra 10 til et andet tal er det så bare disse to der skal ændres?

function getRndImg($arr, $count = 10){

og

$ranpic = getRndImg(getImgArr("../images/layout_top/"), 10);

(tallene 10...)
Avatar billede cyfer Nybegynder
20. december 2004 - 15:35 #25
Jeps... Det er en skide dum, dummefejl ;)
Avatar billede iss Novice
20. december 2004 - 15:37 #26
Kun den sidste... det er det der er det smarte, vil du skrive 10 behøver du slet ikke at skrive noget, så er getRndImg(getImgArr("../images/layout_top/")); nok.
Avatar billede cyfer Nybegynder
20. december 2004 - 15:59 #27
Okay, så hvis jeg har 12 billeder i mappen skriver jeg bare

$ranpic = getRndImg(getImgArr("../images/layout_top/"), 12);
Avatar billede iss Novice
20. december 2004 - 16:06 #28
Helst ikke.... da den bliver sløvere og sløvere forstil dig hvis du har 100 billeder og du sætter den til 99, som kan do while lykken komme til at køre MANGE gange før end den finder det sidste tal....

Så sæt den til noget der ligner 80% dvs har du 10 så sæt den til 8. For jeg har ikke lavet nogen test på om det kan lade sig gøre, tror du får problemer hvis du har 5 billeder og skriver 8 f.eks....
Avatar billede iss Novice
20. december 2004 - 16:07 #29
Men, ja, det er der du skriver hvor mange unike du vil have efter hinanden.
Avatar billede iss Novice
20. december 2004 - 16:08 #30
Og en
if (empty($_SESSION['randimd'])) $_SESSION['randimd'] = array();
ville fjerne det der in_array problem.
Avatar billede cyfer Nybegynder
20. december 2004 - 16:10 #31
Okay, har fundet ud af at man skal skrive et tal under det antal man har i mappen (det er jo klart da den kigger tilbage på de sidste x den har haft)...

Lige en ulempe ved dit script... Den laver en random rækkefølge første gang man kommer ind på sitet, men når den har kørt den igennem, starter den bare forfra på rækkefølgen.. Det er ikke så smart...

Altså 1. gang på sitet
03
05
04
---
03
05
04

2. gang på sitet
08
06
01
---
08
06
01


Den skulle jo gerne randomize igen efter det sidste billede er brugt op.. Hvis du forstår ?
Avatar billede cyfer Nybegynder
20. december 2004 - 16:15 #32
Kan du ikke lige lave det om... + det der med if(emty.....

På forhånd mange tak. :)
Avatar billede iss Novice
20. december 2004 - 16:16 #33
Det er fordi du har sat tallet for højt, lad as sige du har fire: 1, 2, 3, 4, 5

Du sætter den til 4, den trækker: 2, 4, 1, 3, 5 nu kommer problemet, hvad skal den vælge? der er jo kun 2 at vælge, for det er det eneste der ikke er brugr i de sidste fire.
Avatar billede cyfer Nybegynder
20. december 2004 - 16:22 #34
Hmmm, ville bare umidelbart tro at det ville kunne løses med en if().... Da man vel ville kunne se i array og så se når den var færdig... bla bla bla... Hvor skal den if(empty)... Ind henne??? Og hvad gør den goedt for?
Avatar billede iss Novice
20. december 2004 - 16:28 #35
Sådan så er det idiotsikret også. (næsten).

session_start();

function getImgArr($dir){
    $dir = opendir($dir);
    $i=0;
    while($file = readdir($dir)){
        if (substr($file,0,1)!=".") {
            $arr[$i] = $file;
            $i++;
        }
    }
    return $arr;
}

function getRndImg($arr, $count = 10){
    if (empty($_SESSION['randimd'])) $_SESSION['randimd'] = array();
    if ($count > (count($arr)*.8)) $count = count($arr)-2;
    if (count($_SESSION['randimd'])>$count) {
        array_shift($_SESSION['randimd']);
    }
    $num = count($arr)-1;
    do {
        $rnd = rand(0,$num);
    } while (in_array($rnd, $_SESSION['randimd']));
    $_SESSION['randimd'][] = $rnd;
    $_SESSION['randimg'][] = $rnd;
    $str = $arr[$rnd];
    return $str;
}

echo getRndImg(getImgArr("./test/"), 99);
Avatar billede cyfer Nybegynder
20. december 2004 - 16:35 #36
Jamen så siger jeg mange tak, og takker af. ;)
Avatar billede iss Novice
20. december 2004 - 16:39 #37
Velbekommen, hvis du ikke har regnet det ud, så kan du ikke sætte den til mere end 80% af hvad der er, så sættes den til 80%, dvs er der 10 og du sætter den til mere end 8 så bliver det det 8.....

if ($count > (count($arr)*.8)) $count = count($arr)-2;
Skal være
if ($count > (count($arr)*.8)) $count = floor(count($arr)*.8);

Sorry....
Avatar billede stig69 Nybegynder
28. december 2004 - 16:32 #38
iss--> har fulgt med i dette spørgsmål og har oprettet spørgsmålet http://eksperten.dk/spm/575026. Hvis jeg har tre tekststykker:

$var[1] = "tekststykke1";
$var[2] = "tekststykke2";
$var[3] = "tekststykke3";

som skal vælges tilfældigt, dog må det foregående tekststykke ikke blive valgt igen. Tænkte på om du kunne hjælpe mig lidt på vej??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester