PHP: indre loop i embedded loop fejler.
Hej,
Jeg har et problem med en embedded FOR-loop struktur der driller, håber I kan hjælpe.
Jeg er ved at lave en shoppingcart og har et problem med at opsamle al data fra en dynamisk generet form.
En bruger kan vælge et antal option dropdown's ved oprettelse af et givent produkt. Han vælger antal af blokke/option sæt ved at sætte $_SESSION['optionsets'] og antallet af "option/stock/price" produkt linjer i hver blok ved at sætte $_SESSION['options'] - begge med numeriske værdier. Det ser således ud når det køres:
FORMEN
<?php
for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {
echo "
";
for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {
echo "Option:
Stock:
Price:
";
}
echo "
";
}
?>
Det forsøges så hentet med:
<?php
for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr)
{
$getoptiontitles[$nr] = strip_tags(mysql_real_escape_string($_POST["option_title$nr"]));
for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1)
{
$getoptionname[$nr1] = strip_tags(mysql_real_escape_string($_POST["option_name$nr"]));
$getoptionstock[$nr1] = strip_tags(mysql_real_escape_string($_POST["stock$nr"]));
$getoptionprice[$nr1] = strip_tags(mysql_real_escape_string($_POST["price$nr"]));
}
}
?>
hver af de tre typer af produktfelter gemmes i hver deres array.
For at tage et konkret eksempel, har jeg valgt at sætte de to session parametre til 2 og 2, og har valgt at kalde blokkene "AA" og "BB "og har indtastet værdier fra 1 - 12 i alle option linjerne. Det ser således ud: http://www.sitepoint.com/forums/attachment.php?attachmentid=49965&d=121…
Mit problem er, at 1-2-3 og 7-8-9 skrives over. Hvorfor sker det? Det er muligt at årsagen er simpel, men jeg har stirret mig selv blind på dette for længe siden.
Udskrivningen af arrays'ne ser således ud:
<?php
Array ( [1] => AA )
Array ( [1] => 4 )
Array ( [1] => 5 )
Array ( [1] => 6 )
Array ( [1] => 4 [2] => 4 )
Array ( [1] => 5 [2] => 5 )
Array ( [1] => 6 [2] => 6 )
Array ( [1] => AA [2] => BB )
Array ( [1] => 10 [2] => 4 )
Array ( [1] => 11 [2] => 5 )
Array ( [1] => 12 [2] => 6 )
Array ( [1] => 10 [2] => 10 )
Array ( [1] => 11 [2] => 11 )
Array ( [1] => 12 [2] => 12 )
?>
Titlerne gemmes fint som Array ( [1] => AA [2] => BB )
Hvordan kringler jeg den her? Hvad gør jeg galt?
Jeg har et problem med en embedded FOR-loop struktur der driller, håber I kan hjælpe.
Jeg er ved at lave en shoppingcart og har et problem med at opsamle al data fra en dynamisk generet form.
En bruger kan vælge et antal option dropdown's ved oprettelse af et givent produkt. Han vælger antal af blokke/option sæt ved at sætte $_SESSION['optionsets'] og antallet af "option/stock/price" produkt linjer i hver blok ved at sætte $_SESSION['options'] - begge med numeriske værdier. Det ser således ud når det køres:
FORMEN
<?php
for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {
echo "
Set Title:
";
for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {
echo "Option:
Stock:
Price:
";
}
echo "
";
}
?>
Det forsøges så hentet med:
<?php
for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr)
{
$getoptiontitles[$nr] = strip_tags(mysql_real_escape_string($_POST["option_title$nr"]));
for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1)
{
$getoptionname[$nr1] = strip_tags(mysql_real_escape_string($_POST["option_name$nr"]));
$getoptionstock[$nr1] = strip_tags(mysql_real_escape_string($_POST["stock$nr"]));
$getoptionprice[$nr1] = strip_tags(mysql_real_escape_string($_POST["price$nr"]));
}
}
?>
hver af de tre typer af produktfelter gemmes i hver deres array.
For at tage et konkret eksempel, har jeg valgt at sætte de to session parametre til 2 og 2, og har valgt at kalde blokkene "AA" og "BB "og har indtastet værdier fra 1 - 12 i alle option linjerne. Det ser således ud: http://www.sitepoint.com/forums/attachment.php?attachmentid=49965&d=121…
Mit problem er, at 1-2-3 og 7-8-9 skrives over. Hvorfor sker det? Det er muligt at årsagen er simpel, men jeg har stirret mig selv blind på dette for længe siden.
Udskrivningen af arrays'ne ser således ud:
<?php
Array ( [1] => AA )
Array ( [1] => 4 )
Array ( [1] => 5 )
Array ( [1] => 6 )
Array ( [1] => 4 [2] => 4 )
Array ( [1] => 5 [2] => 5 )
Array ( [1] => 6 [2] => 6 )
Array ( [1] => AA [2] => BB )
Array ( [1] => 10 [2] => 4 )
Array ( [1] => 11 [2] => 5 )
Array ( [1] => 12 [2] => 6 )
Array ( [1] => 10 [2] => 10 )
Array ( [1] => 11 [2] => 11 )
Array ( [1] => 12 [2] => 12 )
?>
Titlerne gemmes fint som Array ( [1] => AA [2] => BB )
Hvordan kringler jeg den her? Hvad gør jeg galt?
Kommentarer14
Re: PHP: indre loop i embedded loop fejler.
For sådan som den ser ud lige nu, så mangler der en afslutning på den første loop
Og så har html fejl i en af linierne, hvor du skriver "labelclass=" istedet for "label class="
Re: PHP: indre loop i embedded loop fejler.
I andet loop, i begge kodeudsnit, bruger du $nr, hvilket nok skulle være $nr1.
Måske skulle du vælge nogle bedre navne til dine variable så det er nemmere at holde styr på.
/Skou
Re: PHP: indre loop i embedded loop fejler.
@Dk_zero_cool:
Jeg har har med vilje skåret koden ind til kun at omfatte det logisk relevante for at holde totalmængden nede, det andet bliver hurtigt noget møg for folk at kigge på og kode paste'ing ser i forvejen ikke alt for fedt ud herinde...
@Skou:
Det er ikke det. Jeg har prøvet at lege med indekseringen allerede, men det giver bare et andet uønsket resultat. Logikken funker perfekt med udskrivningen af formen, bare ikke opsamlingen.
Det resultat jeg er på udkig efter ville nok se noget nær således ud i print_r()
<?php
Array ( [1] => AA )
Array ( [1] => 1 )
Array ( [1] => 2 )
Array ( [1] => 3 )
Array ( [1] => 1 [2] => 4 )
Array ( [1] => 2 [2] => 5 )
Array ( [1] => 3 [2] => 6 )
Array ( [1] => AA [2] => BB )
Array ( [1] => 7 )
Array ( [1] => 8 )
Array ( [1] => 9 )
Array ( [1] => 7 [2] => 10 )
Array ( [1] => 8 [2] => 11 )
Array ( [1] => 9 [2] => 12 )
?>
Re: PHP: indre loop i embedded loop fejler.
Og problemet er at du laver en form med identiske navne.
ligger inde i 2 loops, ergo skal du have 2 nummereringer på. Så noget i stil med:
skulle virke...
Eksempel:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
print_r($_POST);
}
echo "\n";
for ($nr = 1; $nr <= 2; ++$nr) {
echo "
\nSet Title:\n\n
\n\n";
for ($nr1 = 1; $nr1 <= 2; ++$nr1) {
echo "Option:\n\n";
echo "Stock:\n\n";
echo "Price:\n\n
\n";
}
echo "
\n";
}
echo "";
echo "";
?>
/Skou
Re: Re: PHP: indre loop i embedded loop fejler.
UPDATE: Det failede, men med undefined index 1 og 2?:
<?php
Array ( [1] => AA )
Notice: Undefined index: option_name1 in /home/arioch/public_html/formprocessor.php on line 268
Array ( [1] => )
Array ( [1] => 5 )
Array ( [1] => 6 )
Notice: Undefined index: option_name1 in /home/arioch/public_html/formprocessor.php on line 268
Array ( [1] => [2] => )
Array ( [1] => 5 [2] => 5 )
Array ( [1] => 6 [2] => 6 )
Array ( [1] => AA [2] => BB )
Notice: Undefined index: option_name2 in /home/arioch/public_html/formprocessor.php on line 268
Array ( [1] => [2] => )
Array ( [1] => 11 [2] => 5 )
Array ( [1] => 12 [2] => 6 )
Notice: Undefined index: option_name2 in /home/arioch/public_html/formprocessor.php on line 268
Array ( [1] => [2] => )
Array ( [1] => 11 [2] => 11 )
Array ( [1] => 12 [2] => 12 )
?>
Re: PHP: indre loop i embedded loop fejler.
Virker følgende ikke som du ønsker?
<?php
for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {
echo "
Set Title:
";
for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {
echo "Option:\n";
echo "\n";
echo "Stock:\n";
echo "\n";
echo "Price:\n";
echo "\n";
echo "
\n";
}
echo "
";
}
?>
og
<?php
for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {
$getoptiontitles[$nr] = strip_tags(mysql_real_escape_string($_POST["option_title$nr"]));
for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {
$getoptionname[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["option_name$nr$nr1"]));
$getoptionstock[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["stock$nr$nr1"]));
$getoptionprice[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["price$nr$nr1"]));
}
}
?>
/Skou
Re: Re: PHP: indre loop i embedded loop fejler.
print_r() af de 4 arrays giver:
<?php
Array ( [1] => AA )
option
Array ( [1] => Array ( [1] => 1 ) )
stock
Array ( [1] => Array ( [1] => 2 ) )
price
Array ( [1] => Array ( [1] => 3 ) )
option
Array ( [1] => Array ( [1] => 1 [2] => 4 ) )
stock
Array ( [1] => Array ( [1] => 2 [2] => 5 ) )
price
Array ( [1] => Array ( [1] => 3 [2] => 6 ) )
option
Array ( [1] => Array ( [1] => 1 [2] => 4 [3] => 7 ) )
stock
Array ( [1] => Array ( [1] => 2 [2] => 5 [3] => 8 ) )
price
Array ( [1] => Array ( [1] => 3 [2] => 6 [3] => 9 ) )
Array ( [1] => AA [2] => BB )
option
Array ( [1] => Array ( [1] => 1 [2] => 4 [3] => 7 ) [2] => Array ( [1] => 10 ) )
stock
Array ( [1] => Array ( [1] => 2 [2] => 5 [3] => 8 ) [2] => Array ( [1] => 11 ) )
price
Array ( [1] => Array ( [1] => 3 [2] => 6 [3] => 9 ) [2] => Array ( [1] => 12 ) )
option
Array ( [1] => Array ( [1] => 1 [2] => 4 [3] => 7 ) [2] => Array ( [1] => 10 [2] => 13 ) )
stock
Array ( [1] => Array ( [1] => 2 [2] => 5 [3] => 8 ) [2] => Array ( [1] => 11 [2] => 14 ) )
price
Array ( [1] => Array ( [1] => 3 [2] => 6 [3] => 9 ) [2] => Array ( [1] => 12 [2] => 15 ) )
option
Array ( [1] => Array ( [1] => 1 [2] => 4 [3] => 7 ) [2] => Array ( [1] => 10 [2] => 13 [3] => 16 ) )
stock
Array ( [1] => Array ( [1] => 2 [2] => 5 [3] => 8 ) [2] => Array ( [1] => 11 [2] => 14 [3] => 17 ) )
price
Array ( [1] => Array ( [1] => 3 [2] => 6 [3] => 9 ) [2] => Array ( [1] => 12 [2] => 15 [3] => 18 ) )
?>
Læren må så være, at for hvert antal lag i et embedded loop, skal man altså slæbe indekseringsvariablen med sig og påføre dem bag på navnestrengen i rækkefølgen yderste loop først til inderste.
Jeg bliver bare lidt nysgerrig, for der laves jo et multidimensional array, men det uden at countervariablerne er adskilt via [$nr][$nr1]? $nr$nr1 burde jo for PHP bare være et enkelt nr. Hvordan fatter PHP at der skal være et multidimensionelt array uden brug af klammerne omkring hver af countervariablerne?
Jeg har fra anden side også fået foreslået at bruge klammer omkring countervariablerne i navngivningen af selve formfelterne for derigennem at kunne benytte $_POST array'et til at parkere det hele i og så tilgå via $_POST['option_title'][$nr] og $_POST['option_name'][$nr][$nr1]., men så vidt jeg ved, failer valideringen af det.
Takker for arbejdet, sætter pris på din tid.
Re: PHP: indre loop i embedded loop fejler.
Læren må så være, at for hvert antal lag i et embedded loop, skal man altså slæbe indekseringsvariablen med sig og påføre dem bag på navnestrengen i rækkefølgen yderste loop først til inderste.
Ja, hver enkel variabel (input felt) skal jo være unik. Hvis der er flere variable med samme navn, er det kun den sidste der bliver registreret af PHP.
Jeg bliver bare lidt nysgerrig, for der laves jo et multidimensional array, men det uden at countervariablerne er adskilt via [$nr][$nr1]?
Nej, i dette tilfælde bliver der ikke lavet et multidimensionelt array. Variablerne hedder noget i stil med:
$nr$nr1F.eks.: option_name21
$nr$nr1 burde jo for PHP bare være et enkelt nr. Hvordan fatter PHP at der skal være et multidimensionelt array uden brug af klammerne omkring hver af countervariablerne?
PHP opfatter ikke de navne (input name) som arrays da der ikke bliver brugt klammer i navnet.
Hvis du i stedet brugte:
[$nr][$nr1]vil PHP tolke dem som arrays. Og dette er nok i virkeligheden bedre da der kan opstå fejl med den anden løsning.
Forestil dig at begge dine løkker kører til 11. Så vil du få to identiske variable nemlig option_name111, men hvis du derimod brugte klammer ville disse være adskilt. Henholdsvis option_name[1][11] og option_name[11][1].
Jeg har fra anden side også fået foreslået at bruge klammer omkring countervariablerne i navngivningen af selve formfelterne for derigennem at kunne benytte $_POST array'et til at parkere det hele i og så tilgå via $_POST['option_title'][$nr] og $_POST['option_name'][$nr][$nr1]., men så vidt jeg ved, failer valideringen af det.
Så laver du et eller andet galt...?
Prøv at se på følgende eksempel:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
echo nl2br(print_r($_POST, true));
}
echo "\n";
for ($i = 0; $i <= 5; ++$i) {
for ($j = 0; $j <= 5; ++$j) {
echo "\n";
}
echo "
\n";
}
echo "";
echo "";
?>
Du kan læse mere om variable som modtages af PHP fra forms på http://www.php.net/manual/en/language.variables.external.php
/Skou
Re: PHP: indre loop i embedded loop fejler.
Re: PHP: indre loop i embedded loop fejler.
Re: PHP: indre loop i embedded loop fejler.
Ja, til den løsning som du leder efter vil jeg mene at det er lettere at bruge arrays...
/Skou
Re: PHP: indre loop i embedded loop fejler.
Formen er:
<?php
for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {
echo "
Set Title:
";
for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {
echo "Option:
Stock:
Price:
";
}
echo "
";
}
}
?>
Opsamlingskoden er:
<?php
for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {
$getoptiontitles[$nr] = strip_tags(mysql_real_escape_string($_POST["option_title[$nr]"]));
for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {
$getoptionname[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["option_name[$nr][$nr1]"]));
$getoptionstock[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["stock[$nr][$nr1]"]));
$getoptionprice[$nr][$nr1 ]= strip_tags(mysql_real_escape_string($_POST["price[$nr][$nr1]"]));
}
}
?>
Mine Arrays er nu tomme...
Mine Arrays er nu
Mine Arrays er nu tomme...
Jep, og det er fordi du tilgår dem forkert.
[1]'/>
registrerer PHP som
<?php
$_POST[""][1]
?>
/Skou
Re: PHP: indre loop i embedded loop fejler.
Takker.