Foreach in foreach

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Y A

Y A

19/05/2011 12:22:29
Quote Anchor link
Hallo mensen,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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');
            }
        }
    }

?>


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

PHP hulp

08/11/2024 16:48:57
 
Pim -

Pim -

19/05/2011 13:07:42
Quote Anchor link
Probeer
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

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

Y A

19/05/2011 20:48:21
Quote Anchor link
@Pim: Ik weet niet wat je niet begrijpt maar ik zal het nog eens uitleggen.

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

Ozzie PHP

19/05/2011 21:20:51
Quote Anchor link
Ik snap de logica van je script niet en ook begrijp ik de afkortingen niet. Je gaat verschillende zaken door elkaar heen in een loop zetten. Dat lijkt me al niet juist.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
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/>');
  }
}

?>


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

Y A

20/05/2011 03:02:11
Quote Anchor link
@Ozzie
Dat komt omdat ik er niks in heb gezet en de 'bug' al weet. dit hoort het te zijn.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
foreach ($this->cart as $cart_artnr => $cart_quant) {
  foreach ($_POST as $pp_artnr => $pq_quantity) {
    if($cart_artnr == $pp_artnr && $pq_quantity){
      $_SESSION[$cart_artnr] = $cart_quant + $pq_quantity;
    }
else{
      throw new exception('Fatal error');
      request::instance()->redirect('cart');
    }
  }
}

?>
 
Tobias Tobias

Tobias Tobias

20/05/2011 06:57:02
Quote Anchor link
als je wilt kijken of de geposte items al in je lijst/aaray voorkomen, kun je ook in_array() gebruiken.
 
Y A

Y A

20/05/2011 09:11:42
Quote Anchor link
@Tobias, nee ik weet al dat het in een array komt ik wil de eerste foreach kunnen vergelijken met de 2de maar stel je voor de eerste foreach heeft 4 waardes
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


Toevoeging op 20/05/2011 18:20:18:

Niemand een oplossing?
Gewijzigd op 20/05/2011 09:13:49 door Y A
 
Y A

Y A

23/05/2011 11:49:37
Quote Anchor link
Heeft niemand een oplossing hiervoor?
 
Y A

Y A

28/05/2011 02:01:48
Quote Anchor link
Probleem opgelost ik heb array_diff(); gebruikt.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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');
        }
    }

?>
 
Tikkes C

Tikkes C

28/05/2011 10:48:29
Quote Anchor link
Ik neem aan dat elk artikel nummer uniek is.
Kan het dan niet zo? (Jou bedoeling is me niet helemaal duidelijk maar ik veronderstel zoiets)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
    }
}

?>
 
Y A

Y A

29/05/2011 02:00:54
Quote Anchor link
@Tikkes, dat is niet zo slim wat jij doet... de for-loop loopt vaker dan het zou moeten omdat de foreach ook een aantal keer loopt.

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



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.