---
title: "Loopa ut en html-tabell?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/64040-loopa-ut-en-html-tabell"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "muskot"
published: "2003-01-07T12:19:41.000Z"
updated: "2003-01-09T14:37:09.000Z"
replies: 14
views: 373
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/64040-loopa-ut-en-html-tabell"
---

# Loopa ut en html-tabell?

## #1 — muskot, 2003-01-07T12:19Z

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.

Permalänk: https://www.webforum.nu/p/64040

## #2 — Qaz, 2003-01-07T12:26Z

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

Vid slutet av loopen plussar du på en

Permalänk: https://www.webforum.nu/p/903931

## #3 — muskot, 2003-01-07T13:52Z

Hm, får det inte att fungera. Det är nåt fel nånstans. Så här ser min (något strippade) kod ut:

```php
$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.

Permalänk: https://www.webforum.nu/p/903982

## #4 — muskot, 2003-01-07T14:35Z

Löste det genom att sätta $i till -1 och använda en if-sats:

```php
$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!

Permalänk: https://www.webforum.nu/p/904012

## #5 — muskot, 2003-01-07T19:29Z

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:

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

Permalänk: https://www.webforum.nu/p/904311

## #6 — Matte, 2003-01-07T19:59Z

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

Permalänk: https://www.webforum.nu/p/904351

## #7 — muskot, 2003-01-07T20:10Z

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

Tusen tack!

Permalänk: https://www.webforum.nu/p/904356

## #8 — muskot, 2003-01-09T11:55Z

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?

Permalänk: https://www.webforum.nu/p/908272

## #9 — Matte, 2003-01-09T12:08Z

> 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;
```

Permalänk: https://www.webforum.nu/p/908280

## #10 — muskot, 2003-01-09T12:17Z

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?

Permalänk: https://www.webforum.nu/p/908283

## #11 — muskot, 2003-01-09T12:51Z

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

Permalänk: https://www.webforum.nu/p/908306

## #12 — Matte, 2003-01-09T13:16Z

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>";
}
```

Permalänk: https://www.webforum.nu/p/908321

## #13 — muskot, 2003-01-09T13:28Z

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!

Permalänk: https://www.webforum.nu/p/908326

## #14 — Matte, 2003-01-09T13:58Z

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

Permalänk: https://www.webforum.nu/p/908340

## #15 — muskot, 2003-01-09T14:37Z

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!

Permalänk: https://www.webforum.nu/p/908374

---

Tråden på webben: https://www.webforum.nu/amne/php/64040-loopa-ut-en-html-tabell
