Går det att få en while-loop att göra olika saker var X:e varv den körs? Om man exempelvis vill loppa ut en tabell och som är X antal celler bred och X antal rader hög? Taggarna <tr> och </tr> ska alltså skrivas ut efter ett visst antal varv.
Loopa ut en html-tabell?
14 svar · 371 visningar · startad av muskot
Hm, får det inte att fungera. Det är nåt fel nånstans. Så här ser min (något strippade) kod ut:
$i = 1;
while(($fil = readdir($opendir)) && (++$i)):
switch ($i):
case 1:
echo "<tr><td>$link_image</td>\n";
case 5:
echo "<td>$link_image</td></tr>\n";
default:
echo "<td>$link_image</td>\n";
endswitch;
if ($i > 5):
unset ($i);
endif;
endwhile;
Problemet är att värdet på $i av någon anledning börjar på 4! Skriver jag ut den får jag först 456, sedan "nollställs" den och börjar på 1. Dvs: 456123456123456.
Löste det genom att sätta $i till -1 och använda en if-sats:
$i = -1;
while ($fil = readdir($opendir)):
if ($i == 1):
echo " <tr>\n <td>\n $link_image \n </td>\n";
elseif ($i == 4):
echo " <td>\n $link_image \n </td>\n </tr>\n\n";
elseif (isset($i)):
echo " <td>\n $link_image \n </td>\n";
endif;
$i++;
if ($i > 4):
unset ($i);
endif;
endwhile;
Skulle dock vilja veta varför switchen i förra inlägget inte fungerar?
Som det är nu blir det dessutom fel ibland i table-koden eftersom sista raden inte alltid har lika många celler som de andra. Några förslag hur man kan lösa det?
Stort tack till Qaz som ledde in mig på rätt spår!
Har testat koden ovan under kvällen och det har visat sig att den inte fungerar nåt vidare.
Koden ska skapa en rad med fyra celler, och sedan börja på en ny rad. Men i bland får den för sig att skapa rader med 1, 3 eller 5 celler. Detta beror nåt fel med räkningen, förstår dock inte VARFÖR det blir fel.
Om man i loopen skirver ut $i borde resultatet bli enligt 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 och så vidare. Så blir det oftast, men inte alltid. Ibland kan det t ex bli så här: 1, 2, 3, 4, 2, 1, 2, 3, 4, 1, 4, 1, 2, 3, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 4.
Det jag har koden till är att lista alla bilder i en katalog. Här är hela funktionen, om någon blir klokare av den:
function browse($dir){
$opendir = opendir($dir);
$i = -1;
while (false !== ($file = readdir($opendir))):
if (eregi("\.jpg$", $file) OR eregi("\.jpeg$", $file)):
$link_image = "<a href=\"?dir=$dir/&img=$file\"><img src=\"?dir=$dir/&img=$file\"></a>";
if ($i == 1):
echo " <tr>\n <td>\n $link_image \n </td>\n";
elseif ($i == 4):
echo " <td>\n $link_image \n </td>\n </tr>\n\n";
elseif (isset($i)):
echo " <td>\n $link_image \n </td>\n";
endif;
endif;
$i++;
if ($i > 4):
unset ($i);
endif;
endwhile;
closedir($opendir);
}
Jättetacksam för hjälp.
EDIT: Kom precis på att felen uppstår när det finns AVI-filer i samma katalog. PHP-, TXT- eller PNG-filer går dock bra (bara filer med ändelsen JPG och JPEG visas; de andra borde väl därmed ignoreras?).
Någon som förstår (eller kan gissa) vad det beror på?
För varje varv som while_slingan körs så uppraknas $i, men utskrift sker endast när filen är av jpeg-format.
Flytta upp uppräkningen av $i till if-satsen if(eregi ...).
Det är tydligen fel på eregi:n också, har märkt att vissa bilder inte kommer med av någon anledning.
eregi("\.jpg$", $file) OR eregi("\.jpeg$", $file)
Kommenterar jag bort den kommer alla bilder med (men även andra filer som finns i katalogen).
Har även lagt till en räknare ($amount). Om det finns 21 jpeg-bilder i en katalog returnerar räknaren 21, men bara 17 bilder visas:
function browse($dir){
$opendir = opendir($dir);
$i = 1;
$amount = 0;
while (false !== ($file = readdir($opendir))):
if (eregi("\.jpg$", $file) OR eregi("\.jpeg$", $file)):
$link_image = "<a href=\"?dir=$dir/&img=$file\"><img src=\"?dir=$dir/&img=$file\"></a>";
if ($i == 1):
echo " <tr>\n <td>\n $link_image \n </td>\n";
elseif ($i == 4):
echo " <td>\n $link_image \n </td>\n </tr>\n\n";
elseif (isset($i)):
echo " <td>\n $link_image \n </td>\n";
endif;
$i++;
$amount++;
endif;
if ($i > 4):
unset ($i);
endif;
endwhile;
if ($amount != 0):
echo "Images: $amount";
endif;
closedir($opendir);
}
Felet uppstår bara i vissa kataloger, oavsett om den innehåller andra filer än .JPG/.JPEG eller inte.
Någon som ser vad som kan tänkas vara galet?
Någon som ser vad som kan tänkas vara galet?
Du använder unset($i). Då kommer nästa varv ingen av if-satserna att uppfyllas. M.a.o du hoppar över var femte bild.
Gör istället så här:
if ($i > 4):
//unset ($i);
$i = 1;
endif;
Ja, kom precis på det själv! Varför börjar hjärnan alltid funka efter att man postat?
Fast jag fattar inte varför det fungerade när man kommenterat bort eregi?
En fråga till:
Kan man kolla om det är loopens sista varv?
Vill ju bl a kunna lägga till colspan och en </tr> om tabellen har ett udda antal celler.
EDIT:
Eller om någon har nåt annat förslag på hur man ska lösa det...
Du har ju variabeln $i. Om $i>1 så ska du lägga till 5-$i <td></td> samt en </tr>
Med en colspan:
if ( $i > 1 ){
$left = 5-$i;
echo "<td colspan=\"$left\"> </td></tr>";
}
Tror inte att jag hänger med. Borde väl bli fel om det bara finns en bild i katalogen, eller om en rad endast har en bild? Eller?
EDIT
Nu fattar jag, jag är trög. Skulle ju dock vara kul om det kunde lösas snyggare...
Ett stort tack för all hjälp så här långt!
Har du t.ex 5 bilder så är $i satt till 2, medan $amount % 4 returnerar värdet 1. Ska du använda $amount så får du skriva
$left = 4-$i;
EDIT
Jag hann svara innan du gjorde din redigering, men låter det stå kvar ändå.
Sådär ja! Nu tror jag att allting fungerar. Om inte annat så återkommer jag nog...
Här är hela funktionen i fall någon annan skulle ha samma problem:
function browse($dir){
$cells = 4;
$opendir = opendir($dir);
$i = 1;
$amount = 0;
while (false !== ($file = readdir($opendir))):
if (eregi("\.jpg$", $file) OR eregi("\.jpeg$", $file)):
$amount++;
$link_image = "<a href=\"?dir=$dir/&img=$file\"><img src=\"?dir=$dir/&img=$file\"></a>";
if ($i == 1):
echo " <tr>\n <td valign=\"bottom\" align=\"center\">\n $link_image \n </td>\n";
elseif ($i == $cells):
echo " <td valign=\"bottom\" align=\"center\">\n $link_image \n </td>\n </tr>\n\n";
elseif (isset($i)):
echo " <td valign=\"bottom\" align=\"center\">\n $link_image \n </td>\n";
endif;
$i++;
endif;
if ($i > $cells):
$i = 1;
endif;
endwhile;
$collumns = $amount % $cells;
if ($collumns != 0):
$left = 1 + $cells - $i;
echo " <td colspan=\"$left\">\n </td>\n </tr>\n\n";
endif;
if ($amount != 0):
echo " <tr>\n <td colspan=\"$cells\">\n Images: $amount \n </td>\n </tr>\n\n";
endif;
closedir($opendir);
}
Stort tack!