webForumDet fria alternativet

Loopa ut en html-tabell?

14 svar · 371 visningar · startad av muskot

muskotMedlem sedan jan. 20027 905 inlägg
#1

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.

QazMedlem sedan feb. 2000211 inlägg
#2

Stoppa in en räknare och styr mha av den.

Vid slutet av loopen plussar du på en

muskotMedlem sedan jan. 20027 905 inlägg
#3

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.

muskotMedlem sedan jan. 20027 905 inlägg
#4

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!

muskotMedlem sedan jan. 20027 905 inlägg
#5

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å?

MatteMedlem sedan aug. 20002 975 inlägg
#6

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 ...).

muskotMedlem sedan jan. 20027 905 inlägg
#7

Ja! Självklart... kanske man skulle ha tänkt på.

Tusen tack!

muskotMedlem sedan jan. 20027 905 inlägg
#8

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?

MatteMedlem sedan aug. 20002 975 inlägg
#9

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;
muskotMedlem sedan jan. 20027 905 inlägg
#10

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?

muskotMedlem sedan jan. 20027 905 inlägg
#11

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...

MatteMedlem sedan aug. 20002 975 inlägg
#12

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>";
}
muskotMedlem sedan jan. 20027 905 inlägg
#13

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!

MatteMedlem sedan aug. 20002 975 inlägg
#14

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å.

muskotMedlem sedan jan. 20027 905 inlägg
#15

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!

128 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)