webForumDet fria alternativet
Logga in / Bli medlem

Slinga i slinga?

PHP

9 svar · 780 visningar · startad av Simpa

Medlem sedan aug. 20002 992 inlägg
Frågan#1

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

<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
$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 :)

Medlem sedan sep. 20005 700 inlägg
#2

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

$slinga = 1;
foreach ($innehall as $rad) 
{ 
     echo $slinga . $rad . "<br>"; 
     $slinga++;
}
Medlem sedan aug. 20002 992 inlägg
#3

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?

Medlem sedan sep. 20005 700 inlägg
#4

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.

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:

for($i = sizeof($innehall)-1; $i >= sizeof($innehall)-10; $i--){
     echo $innehall[$i] . "<br/>";
}
Medlem sedan aug. 20002 992 inlägg
#5

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

Medlem sedan aug. 20002 992 inlägg
#6

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

<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
$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);
}
?>
Medlem sedan sep. 20005 700 inlägg
#7

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:

for($i = sizeof($innehall)-1; $i >= sizeof($innehall)-5; $i--){ 
    echo "<tr><td width='150'>" . $radnr . ". " . $innehall[$i] . "<br/>" . $namnhall[$i] . "</td></tr>"; 
    $radnr++; 
}
Medlem sedan aug. 20002 992 inlägg
#8

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

Medlem sedan aug. 20002 992 inlägg
#9

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

Medlem sedan sep. 20005 700 inlägg
#10

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

276 ms totalt · 4 externa anrop · v20260731065814-full.14655e19
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)