Foreach in foreach
Ik zat een kleine probleempje ik heb een winkelwagen gemaakt dat werkt allemaal,
Alleen als je wilt updaten dan gaat het mis ik heb een foreach in een foreach gezet maar ik wist al dat dat fout zou gaan want de eerste foreach gaat loopen en dan loopt de andere foreach ook het aantal keren mee dus 3 x 3 krijg ik 9 outputs ipv gwn 3 dit is het script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
public function action_update() {
if (empty($this->cart)) {
Request::instance()->redirect('cart?message=error_empty');
}
if ($_POST && !empty($this->cart)) {
if (is_array($_POST) && is_array($this->cart)) {
foreach ($this->cart as $cart_artnr => $cart_quant) {
foreach ($_POST as $pp_artnr => $pq_quantity) {
// dit is alleen een check dus het aantal y * x
print_r('Artnr: ' . $pp_artnr . ' heeft ' . $pq_quantity . '<br/>');
}
}
} else {
throw new Exception('De post of shop is geen array.', '404');
}
}
}
?>
public function action_update() {
if (empty($this->cart)) {
Request::instance()->redirect('cart?message=error_empty');
}
if ($_POST && !empty($this->cart)) {
if (is_array($_POST) && is_array($this->cart)) {
foreach ($this->cart as $cart_artnr => $cart_quant) {
foreach ($_POST as $pp_artnr => $pq_quantity) {
// dit is alleen een check dus het aantal y * x
print_r('Artnr: ' . $pp_artnr . ' heeft ' . $pq_quantity . '<br/>');
}
}
} else {
throw new Exception('De post of shop is geen array.', '404');
}
}
}
?>
Enige idee hoe dit anders kan? want zover ik weet heb ik echt 2 foreach loops nodig 1 om alles uit de session cart te hallen en de andere om alles uit de $_POST array te halen...
Quote:
Ik zat een kleine probleempje ik heb een winkelwagen gemaakt dat werkt allemaal,
Alleen als je wilt updaten dan gaat het mis ik heb een foreach in een foreach gezet maar ik wist al dat dat fout zou gaan want de eerste foreach gaat loopen en dan loopt de andere foreach ook het aantal keren mee dus 3 x 3 krijg ik 9 outputs ipv gwn 3 dit is het script
Alleen als je wilt updaten dan gaat het mis ik heb een foreach in een foreach gezet maar ik wist al dat dat fout zou gaan want de eerste foreach gaat loopen en dan loopt de andere foreach ook het aantal keren mee dus 3 x 3 krijg ik 9 outputs ipv gwn 3 dit is het script
Eens in Nederlands om te zetten...
Verder moet kan je proberen de tweede foreach om te zetten naar $pq_quantity = $_POST[$cart_artnr];
Maar ik snap je script niet helemaal. Iig moet je in die richting zoeken.
In dat stukje script wil ik uit mijn session cart ($this->cart) de items uithalen door een foreach. Maar als het form wordt gesubmit dan wil ik ook een foreach $_POST om de waarde $cart_artnr te vergelijken met de $pp_artnr en de $cart_quant te updaten met de $pq_quant. maar het probleem is als je een foreach in een foreach zet dat de 2de foreach steeds mee loopt zolang de eerste foreach loopt dus bijv: foreach 1 loopt 5 keer maar de 2de foreach hoeft maar 2 keer dan output de 2de foreach loop 10keer de normale output die normaal maar 2 keer hoeft.
ik weet me geen raad meer...
Code (php)
Leg mij eens uit wat die 1e foreach loop doet? Je doet namelijk helemaal niks met de variabelen $cart_artnr en $cart_quant.
Gewijzigd op 19/05/2011 21:21:15 door Ozzie PHP
Dat komt omdat ik er niks in heb gezet en de 'bug' al weet. dit hoort het te zijn.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
als je wilt kijken of de geposte items al in je lijst/aaray voorkomen, kun je ook in_array() gebruiken.
en de tweede foreach loop maar 2 waardes dan loopt de eerste loop 4 x de 2de loop dus 8 keer... probeer het maar.. (zie hieronder een output voorbeeld)
Quote:
Artnr: pp_2658 heeft 10
Artnr: pp_12589 heeft 20
Artnr: pp_2003 heeft 30
Artnr: pp_2658 heeft 10
Artnr: pp_12589 heeft 20
Artnr: pp_2003 heeft 30
Artnr: pp_2658 heeft 10
Artnr: pp_12589 heeft 20
Artnr: pp_2003 heeft 30
Artnr: pp_12589 heeft 20
Artnr: pp_2003 heeft 30
Artnr: pp_2658 heeft 10
Artnr: pp_12589 heeft 20
Artnr: pp_2003 heeft 30
Artnr: pp_2658 heeft 10
Artnr: pp_12589 heeft 20
Artnr: pp_2003 heeft 30
Toevoeging op 20/05/2011 18:20:18:
Niemand een oplossing?
Gewijzigd op 20/05/2011 09:13:49 door Y A
Heeft niemand een oplossing hiervoor?
Maar stel het huidige getal is 1 en ik wil nog 1 toevoegen dan doet hij dat natuurlijk niet want er is geen verschil dat is het jammere eraan.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
public function action_update() {
if (empty($this->cart)) {
Request::instance()->redirect('cart?message=error_empty');
}
if ($_POST && !empty($this->cart)) {
if (is_array($_POST) && is_array($this->cart)) {
// Het verschill in posts
$differance = array_diff($_POST, $this->cart);
foreach ($differance as $artnr => $quantity) {
// Update de cart [artnr]
$_SESSION['cart'][$artnr] = $this->cart[$artnr] + $quantity;
}
// Terug sturen met een message dat het gelukt is.
request::instance()->redirect('cart?message=updated');
}
} else {
throw new Exception('De post of shop is geen array.', '403');
}
}
?>
public function action_update() {
if (empty($this->cart)) {
Request::instance()->redirect('cart?message=error_empty');
}
if ($_POST && !empty($this->cart)) {
if (is_array($_POST) && is_array($this->cart)) {
// Het verschill in posts
$differance = array_diff($_POST, $this->cart);
foreach ($differance as $artnr => $quantity) {
// Update de cart [artnr]
$_SESSION['cart'][$artnr] = $this->cart[$artnr] + $quantity;
}
// Terug sturen met een message dat het gelukt is.
request::instance()->redirect('cart?message=updated');
}
} else {
throw new Exception('De post of shop is geen array.', '403');
}
}
?>
Kan het dan niet zo? (Jou bedoeling is me niet helemaal duidelijk maar ik veronderstel zoiets)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
public function action_update() {
foreach ($_POST as $pp_artnr => $pq_quantity) {
for($i = 0; $i < count($this->cart); $i++) {
if($this->cart[$i]->getArtNr() == $pp_artnr) {
$cart = $this->cart[i];
}
else {
//exception: geen cart gevonden
}
}
$cart->setQuantity = $cart->getQuantity() + $pq_quantity;
print "new quantity: ". $cart->getQuantity();
}
}
?>
public function action_update() {
foreach ($_POST as $pp_artnr => $pq_quantity) {
for($i = 0; $i < count($this->cart); $i++) {
if($this->cart[$i]->getArtNr() == $pp_artnr) {
$cart = $this->cart[i];
}
else {
//exception: geen cart gevonden
}
}
$cart->setQuantity = $cart->getQuantity() + $pq_quantity;
print "new quantity: ". $cart->getQuantity();
}
}
?>
Bijv: $_POST heeft 4 posts
de $this->cart heeft er 5
Dan krijg je ongeveer zoiets
Product 2021 bevat 20 aantal
Product 2025 bevat 5 aantal
Product 5069 bevat 55 aantal
Product 3386 bevat 81 aantal
Product 2021 bevat 20 aantal
Product 2025 bevat 5 aantal
Product 5069 bevat 55 aantal
Product 3386 bevat 81 aantal
Product 2021 bevat 20 aantal
Product 2025 bevat 5 aantal
Product 5069 bevat 55 aantal
Product 3386 bevat 81 aantal
Product 2021 bevat 20 aantal
Product 2025 bevat 5 aantal
Product 5069 bevat 55 aantal
Product 3386 bevat 81 aantal
Product 2021 bevat 20 aantal
Product 2025 bevat 5 aantal
Product 5069 bevat 55 aantal
Product 3386 bevat 81 aantal
En dat kost natuurlijk geheugen en snelheid, en dat is wat ik niet wil.
Maar de array_diff(); functie werkt goed!
Toch bedankt voor het idee!!