Paulinjsh Posted November 7, 2005 Report Share Posted November 7, 2005 Nepieciešams no diras izvadīt 3 bildes tā, lai tās būtu dažādas un pēc random. Uztaisīju uz ātro šitādu skriptu: <div id="bildes"> <? $dir = opendir("images/"); $i = 0; while ( ( false !== ( $fails = readdir( $dir ) ) ) && $i < 3 ) { if ( eregi( '(jpg|jpeg|gif|png|bmp)$', $fails ) ) { if ( rand( 0, 1 ) == 1 ) {?> <img src="images/<? echo $fails ?>" alt="<? echo $fails ?>" title="<? echo $fails ?>" style="width: 150px; height:100px;" /><br /><? $i++; } } } ?> </div> Kādas problēmas: Var sanākt gadījums, kad izvada 0, 1 vai 2 bildes. Tas neder, jo vajaga izvadīt tieši 3 bildes. Kā šito varētu atrisināt? Link to comment Share on other sites More sharing options...
bubu Posted November 7, 2005 Report Share Posted November 7, 2005 Savāc visus urļus masīvā - izvēlies random skaitli 0...length-1, izvadi urli, izdzēs no masīva. Pēdējās 3 darbības atkārto vēl 2 reizes. Link to comment Share on other sites More sharing options...
Paulinjsh Posted November 7, 2005 Author Report Share Posted November 7, 2005 O šitādu fikso variantu nebiju izdomājis :) Kā vienmēr bubu lielais thnx. Ko mēs bez tevīm darītu ;) Link to comment Share on other sites More sharing options...
hmnc Posted November 7, 2005 Report Share Posted November 7, 2005 kaut vai arī liec randomās vērtības masīvā kuru pārbaudi vai nesatur katru nākošo randomo vērtību :) Link to comment Share on other sites More sharing options...
Paulinjsh Posted November 8, 2005 Author Report Share Posted November 8, 2005 Paldies par help. Problēma jau atrisināta. Link to comment Share on other sites More sharing options...
Grey_Wolf Posted November 8, 2005 Report Share Posted November 8, 2005 kaut vai arī liec randomās vērtības masīvā kuru pārbaudi vai nesatur katru nākošo randomo vērtību :) var shaadi ..... function randomaizeris($min,$max,$num) { $ret = array(); if ($max<($num-1)) { return false; } while (count($ret) <$num) { do { $a = rand($min,$max); } while (in_array($a,$ret)); $ret[] = $a; } return($ret); } //////// ielasi visus urljus masiivaa teiksim $masivs // $min = sakuma vertiiba - tavaa gadijumaa 0 // $max= beigu vertiiba tev cik to bilzju urlju sanaak // $num = cik gribi izvadiit $kura_bilde=randomaizeris($min,$max,$num); // $kura_bilde = masiivs no $num skaitljiem $masivs[$kura_bilde]; // bildes izvadiishana -------- Link to comment Share on other sites More sharing options...
bubu Posted November 8, 2005 Report Share Posted November 8, 2005 (edited) in_array() nav ātrs - O(n) laikā (vajag skriet visiem elementiem cauri). Labāk darīt šādi: $ret[$a] = true; // uzstāda, ka ir bijis // skatās vai ir bijis if (array_key_exists($a, $ret)) { ... // ir iekš masīva } else { ... // nav iekš masīva } Tad noteikšanas laiks tuvosies O(1). Jo asociatīvais masīvs php tiek realizēts kā heštabula. Edited November 8, 2005 by bubu Link to comment Share on other sites More sharing options...
litt Posted November 8, 2005 Report Share Posted November 8, 2005 Par array_key_exists PHP manuāļa lietotāju komentāri nav visai pozitīvi, taču skripta autoram pašam ir jāskatās kurš variants kurā gadījmā strādā ātrāk Link to comment Share on other sites More sharing options...
bubu Posted November 8, 2005 Report Share Posted November 8, 2005 Nu tad array_key_exists() vietā var lietot isset(), efekts būs tāds pats. Link to comment Share on other sites More sharing options...
Paulinjsh Posted November 8, 2005 Author Report Share Posted November 8, 2005 <div id="bildes"> <? $dir = opendir("images/"); $urlArray = array(); while ( ( false !== ( $fails = readdir( $dir ) ) ) ) { if ( eregi( '(jpg|jpeg|gif|png|bmp)$', $fails ) ) { array_push( $urlArray, $fails ); } } for ( $i = 0; $i < 3; $i++ ) { $id = rand( 0, count( $urlArray ) - 1 ); <img src="images/<? echo $urlArray[$id] ?>" alt="<? echo $urlArray[$id] ?>" style="width: 150px; height:100px;" /><br /><? unset( $urlArray[$id] ); $tmp = array(); foreach ( $urlArray as $index => $key ) { array_push( $tmp, $key ); } $urlArray = $tmp; } ?> </div> Nu es uzrakstīju šitā. Kādi komentāri? Pašam izskatās nedaudz līki :) Link to comment Share on other sites More sharing options...
bubu Posted November 8, 2005 Report Share Posted November 8, 2005 $tmp = array(); foreach ( $urlArray as $index => $key ) { array_push( $tmp, $key ); } $urlArray = $tmp; vietā var $urlArray = array_values($urlArray); Bet ja gribi vēl ātrāk - tad vajag uz array_slice() skatīties. Link to comment Share on other sites More sharing options...
Paulinjsh Posted November 8, 2005 Author Report Share Posted November 8, 2005 (edited) O, array_values() šitādu funkciju nebiju piefiksējis. Pamēģināsim un to array_slice() arī aplūrēšu :) Thnx! A bubu ar array_slice() sanāk šitā $urlArray = array_slice($urlArray, 0); a ko tas 2 dod es neiebraucu un kur šķirba arī īsti nē ;/ Edited November 8, 2005 by Paulinjsh Link to comment Share on other sites More sharing options...
blackhalt Posted November 8, 2005 Report Share Posted November 8, 2005 (edited) <?php $a=glob("images/{*.gif,*.jpg,*.jpeg,*.png}", GLOB_BRACE); $b=count($a)-1; srand((double)microtime()*1000000); $c=rand(0,$b); echo $a[$c]; $c=rand(0,$b); echo $a[$c]; $c=rand(0,$b); echo $a[$c]; ?> Edited November 8, 2005 by blackhalt Link to comment Share on other sites More sharing options...
Paulinjsh Posted November 8, 2005 Author Report Share Posted November 8, 2005 Tavā skriptā nesanāk unikālas bildes vai arī es kļūdos? Un kāda jēga srand izsaukt 3 reizes, ja manuprāt pietiek ar 1.? Link to comment Share on other sites More sharing options...
blackhalt Posted November 8, 2005 Report Share Posted November 8, 2005 (edited) Tavā skriptā nesanāk unikālas bildes vai arī es kļūdos? Un kāda jēga srand izsaukt 3 reizes, ja manuprāt pietiek ar 1.? unikālas vienmēr nesanāks gan :/ nu bet ~ ;) tad jāparbauda vai tāds un tāds nav = bet nu šitāds man te uzrakstījās. Edited November 8, 2005 by blackhalt Link to comment Share on other sites More sharing options...
Recommended Posts