---
title: "Slinga i slinga?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/170112-slinga-i-slinga"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Simpa"
published: "2008-03-21T11:53:28.000Z"
updated: "2008-04-08T05:55:55.000Z"
replies: 9
views: 780
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/170112-slinga-i-slinga"
---

# Slinga i slinga?

## #1 — Simpa, 2008-03-21T11:53Z

Lyckas inte få detta att fungera som jag vill, håller på att lära mig PHP precis, går det att lägga en foreach slinga i en for slinga? det jag vill åstakomma är att jag vill skriva ut dem 10 översta raderna i textdokumentet, med radens nummer brevid, men det som händer är att den skriver ut allt innehåll i textfilen 10ggr!

tyck.php

```php
<b>Tyck till..</b><br>
<form action="arb.php" method="post">
<INPUT TYPE="text" NAME="ruta" maxlength="50"> (max 50 tecken)<br>
<input name="skicka" type="submit" value="Kommentera">
</form>
<br>
<br>
Senaste 10 kommentarerna:<br>
<?php
$filnamn = "senaste.txt"; 
$innehall = file($filnamn);
for ($slinga=1; $slinga <= 10; $slinga++)
{

foreach ($innehall as $rad) 
{ 
     echo $slinga . $rad . "<br>";

}

} 
?>
```

 

arb.php

```php
<?php
$tyck = $_POST["ruta"];

if (empty($tyck))
{
echo "Du måste skriva något..<br><a href=tyck.php>Tillbaka</a>";
}
else 
{
$utan = htmlspecialchars($tyck, ENT_QUOTES);

echo "Din kommentar:<br>" . $utan . "<br>" . "Syns nu på <a href=tyck.php>förstasidan!</a>";

$skriv = $utan . "\r\n";
$oppna = fopen("senaste.txt", "a+");
fwrite($oppna, $skriv);
fclose($oppna);
}
?>
```

 

Ett annat problem är ju att a+ gör så att jag skriver ifrån botten av textfilen, så om jag vill visa dem 10 senaste "inläggen" så blir det fel och jag visar dem 10 äldsta istället, har prövat mig av att använda "r+" istället, men upplever att det blir något fel, känns som den skriver över det äldre i min textfil istället för att börja längst fram utan att skriva över..!

Tacksam för hjälp/förklaringar :)

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

## #2 — Gein, 2008-03-21T11:59Z

Du behöver ingen loop i loopen för att åstadkomma det du vill:

```php
$slinga = 1;
foreach ($innehall as $rad) 
{ 
     echo $slinga . $rad . "<br>"; 
     $slinga++;
}
```

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

## #3 — Simpa, 2008-03-21T12:03Z

Tack Gein, det är sant loopen behövs ju inte för att skriva ut radnummret, men hur gör jag för att endast skriva ut dem 10 översta raderna?

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

## #4 — Gein, 2008-03-21T12:37Z

När du kör kommandot file så hämtar du in allt innehåll från filen till arrayen $innehall.

Det du nu vill göra är att skriva ut de 10 sista elementen ur arrayen $innehall. För att få ut storleken kör du sizeof($innehall).

Om sizeof($innehall) ger resultatet 3 så innebär det att det finns tre rader på platserna: $innehall\[0\], $innehall\[1\] och $innehall\[2\].

Du vill loopa från den sista platsen till den 10:e sista platsen. Det första elementet att plocka ut blir alltså sizeof($innehall)-1.

```php
for($i = sizeof($innehall)-1; ...; ...)
```

Loopen ska fortsätta tills vi har läst 10 element och vi läser "baklänges", alltså ska $i minska, inte öka. Resultatet blir:

```php
for($i = sizeof($innehall)-1; $i >= sizeof($innehall)-10; $i--){
     echo $innehall[$i] . "<br/>";
}
```

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

## #5 — Simpa, 2008-03-21T12:52Z

Funkar helt perfekt, stort tack för hjälpen och den bra förklaringen!

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

## #6 — Simpa, 2008-03-21T23:51Z

Skulle vilja skriva ut det namnet, som tillhör varje inlägg precis efter inlägget, jag löste det så här, men blir inte optimalt med två tabeller brevid varandra, går det på något sätt att få in $namnhall i samma for loop som $innehall?

En annan lösning vore väl att skriva, in namnet i samma fil som innehållet och hämta det därifrån, lite osäker på hur en sådan lösning skulle se ut dock..!

Någon som har några tips eller ideer?  :)

tyck.php

```php
<b>Tyck till..</b><br>
<form action="arb.php" method="post">
<TEXTAREA NAME="ruta" ROWS="5" COLS="25" maxlength="150"></TEXTAREA>
 (max 150 tecken)<br> Namn: <INPUT TYPE="text" NAME="namn">
<input name="skicka" type="submit" value="Kommentera">
</form>
<br>
<br>
Senaste 5 kommentarerna:<br>
<table>
<tr>
<td>

<table>
<?php
$filnamn = "senaste.txt"; 
$innehall = file($filnamn);
$radnr = 1;
$filnam = "namn.txt";
$namnhall = file($filnam);

for($i = sizeof($innehall)-1; $i >= sizeof($innehall)-5; $i--){ 
	echo "<tr><td width='150'>" . $radnr . ". " . $innehall[$i] . "</td></tr>"; 
	$radnr++;
} 
echo "</table>";
echo "</td><td>";
echo "<table>";

for($i = sizeof($namnhall)-1; $i >= sizeof($namnhall)-5; $i--){ 
	echo "<tr><td>" . $namnhall[$i] . "</td></tr>"; 
}
?>
</table>
</td>
</tr>
</table>
```

 

arb.php

```php
<?php
$tyck = $_POST["ruta"];
$nam = $_POST["namn"];

if (empty($tyck) || empty($nam))
{
echo "Du måste fylla i både namn och en kommentar..<br><a href=tyck.php>Tillbaka</a>";
}
else 
{
$utan = htmlspecialchars($tyck, ENT_QUOTES);
$utan = str_replace("\r\n", "", $utan);
echo "Din kommentar:<br>" . $utan . "<br>" . "Syns nu på <a href=tyck.php>förstasidan!</a>";

$skriv = $utan . "\r\n";
$oppna = fopen("senaste.txt", "a+");
fwrite($oppna, $skriv);
fclose($oppna);

$utannamn = htmlspecialchars($nam, ENT_QUOTES);
$utannamn = str_replace("\r\n", "", $utannamn);
$skrivnamn = $utannamn . "\r\n";

$oppnanamn = fopen("namn.txt", "a+");
fwrite($oppnanamn, $skrivnamn);
fclose($oppnanamn);
}
?>
```

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

## #7 — Gein, 2008-03-22T14:40Z

Under förutsättningen att senaste.txt innehåller lika många rader som namn.txt samt att varje rad x i senaste.txt hör till namnet på rad x i namn.txt så kan du köra:

```php
for($i = sizeof($innehall)-1; $i >= sizeof($innehall)-5; $i--){ 
    echo "<tr><td width='150'>" . $radnr . ". " . $innehall[$i] . "<br/>" . $namnhall[$i] . "</td></tr>"; 
    $radnr++; 
}
```

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

## #8 — Simpa, 2008-03-22T20:00Z

Tack återigen för en bra och enkel lösning!

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

## #9 — Simpa, 2008-04-07T22:10Z

Väcker liv i denna tråd istället för att skapa en ny!

Har nu gjort om lite, och använder mig av en textdatabas istället för flera olika, men har lite problem med att få det att fungera..!

databas.txt:

```
2||01:48 4/4-08||Namn||mail@mail.se||Meddelande||90.229.128.53
```

loop.php:

```php

<?php
for($i = sizeof($innehall)-1; $i >= sizeof($innehall)- $att_loopa; $i--){ 

$raden = explode("||", $innehall[i], -1);
$radnrq = $raden[0];
$datumq = $raden[1];
$innehallq = $raden[2];
$epostq = $raden[3];
$namnq = $raden[4]; 
$ipq = $raden[5];

echo $radnrq[$i]; 
echo $datumq[$i];
echo $innehallq[$i];
echo $epostq[$i];
echo $namnq[$i];
} 
?>
```

Generar följande error:

```
Notice: Use of undefined constant i - assumed 'i' in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 6

Notice: Undefined index: i in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 6

Notice: Undefined offset: 1 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 8

Notice: Undefined offset: 2 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 9

Notice: Undefined offset: 3 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 10

Notice: Undefined offset: 4 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 11

Notice: Undefined offset: 5 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 12

..osv..
```

/ Simon

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

## #10 — Gein, 2008-04-08T05:55Z

> **Simpa skrev:**
>
> Väcker liv i denna tråd istället för att skapa en ny!
> 
> Har nu gjort om lite, och använder mig av en textdatabas istället för flera olika, men har lite problem med att få det att fungera..!
> 
> databas.txt:
>
>
> ```
> 2||01:48 4/4-08||Namn||mail@mail.se||Meddelande||90.229.128.53
> ```
>
> 
> 
> 
> 
> loop.php:
>
>
> ```php
> 
> <?php
> for($i = sizeof($innehall)-1; $i >= sizeof($innehall)- $att_loopa; $i--){ 
> 
> $raden = explode("||", $innehall[i], -1);
> $radnrq = $raden[0];
> $datumq = $raden[1];
> $innehallq = $raden[2];
> $epostq = $raden[3];
> $namnq = $raden[4]; 
> $ipq = $raden[5];
> 
> echo $radnrq[$i]; 
> echo $datumq[$i];
> echo $innehallq[$i];
> echo $epostq[$i];
> echo $namnq[$i];
> } 
> ?>
> ```
>
> 
> 
> 
> Generar följande error:
> 
>
>
> ```
> Notice: Use of undefined constant i - assumed 'i' in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 6
> 
> Notice: Undefined index: i in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 6
> 
> Notice: Undefined offset: 1 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 8
> 
> Notice: Undefined offset: 2 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 9
> 
> Notice: Undefined offset: 3 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 10
> 
> Notice: Undefined offset: 4 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 11
> 
> Notice: Undefined offset: 5 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 12
> 
> ..osv..
> ```
>
> 
> 
> / Simon

"Use of undefined constant" får du eftersom du har missat ett **$** i **$innehall** (ska vara $innehall\[$i\]).

"Undefined offset X" betyder att det inte finns något definierat värde i arrayen på position X.

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

---

Tråden på webben: https://www.webforum.nu/amne/php/170112-slinga-i-slinga
