Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przeszkuwianie tablicy pod katem istniejącej zmiennej
Forum PHP.pl > Forum > Przedszkole
rozny
Witam,

mój problem jest z goła błahy, ale nie zmienia to faktu, że się z nim pieszczę już zdecydowanie za długo, dlatego postanowiłem poszukać pomocy u Was smile.gif

Temat - koszyk sklepowy
Problem - Dodaję towar do koszyka - trzymam to w dwuwymiarowej tablicy. Skrypt ma sprawdzić, czy taki towar już istnieje, jeżeli tak, to wyświetla info, jeżeli nie to dodaje do koszyka. Problem w tym, że nawet jeśli skrypt znajdzie już produkt w tablicy, to wyświetla info i dodaje kolejny raz ten sam produkt do tablicy.
Szukamy towaru po "$prod_id".

Tablica:

  1. array
  2. 0 =>
  3. array
  4. 'prod_id' => string '3' (length=1)
  5. 'amount' => string '1' (length=1)
  6. 1 =>
  7. array
  8. 'prod_id' => string '1' (length=1)
  9. 'amount' => string '1' (length=1)
  10. 2 =>
  11. array
  12. 'prod_id' => string '1' (length=1)
  13. 'amount' => string '1' (length=1)


Próbowałem na dwa sposoby chapnąć to zagadnienie, ale oba działają tak samo, dlatego stwierdzam że to problem mojego podejścia do tematu. Prosiłbym o przeanalizowanie tych skryptów i podzielenie się ze mną solucją jak to zjeść i nie zwrócić wink.gif

Sposób 1:

  1. $product_id = trim(htmlspecialchars($_POST['product_id']));
  2. $amount_of_product = trim(htmlspecialchars($_POST['amount_of_product']));
  3.  
  4. $tab = array('prod_id' => ''.$product_id.'', 'amount' => ''.$amount_of_product.'');
  5.  
  6. $iloscrekordow = count($_SESSION['sklep.koszyk']);
  7.  
  8. if ($iloscrekordow == 0) {
  9. $_SESSION['sklep.koszyk'][] = $tab;
  10. }
  11.  
  12. else {
  13.  
  14. for($i = 0; $i<$iloscrekordow; $i++){
  15. if (in_array($product_id, $_SESSION['sklep.koszyk'][$i])) {
  16. echo 'Produkt istnieje w koszyku';
  17.  
  18. }
  19.  
  20. else {
  21. $_SESSION['sklep.koszyk'][] = $tab;
  22. break;
  23. }
  24. }
  25.  
  26. }


Sposób 2:

  1. $product_id = trim(htmlspecialchars($_POST['product_id']));
  2. $amount_of_product = trim(htmlspecialchars($_POST['amount_of_product']));
  3.  
  4. $tab = array('prod_id' => ''.$product_id.'', 'amount' => ''.$amount_of_product.'');
  5.  
  6. $iloscrekordow = count($_SESSION['sklep.koszyk']);
  7.  
  8. if ($iloscrekordow == 0) {
  9. $_SESSION['sklep.koszyk'][] = $tab;
  10. }
  11.  
  12. else {
  13.  
  14. $result=-1;
  15. foreach($_SESSION['sklep.koszyk'] as $key=>$val){
  16. if($val['prod_id']==$product_id){
  17. $result=$key;
  18. }
  19. else {
  20. $_SESSION['sklep.koszyk'][] = $tab;
  21. }
  22. }
  23. echo $result;
  24. }


Będę wdzięczny za pomoc smile.gif
Tuminure
O ile dobrze zrozumiałem kod i założenia, to w obydwóch sposobach na moje oko problemem jest pętla (for w pierwszym, foreach w drugim).

  1. for($i = 0; $i<$iloscrekordow; $i++){
  2. if (in_array($product_id, $_SESSION['sklep.koszyk'][$i])) {
  3. echo 'Produkt istnieje w koszyku';
  4.  
  5. }
  6.  
  7. else {
  8. $_SESSION['sklep.koszyk'][] = $tab;
  9. break;
  10. }
  11. }
Przypuśćmy, że zmienna $iloscrekordow jest równa 3, a poszukiwany produkt istnieje w koszyku...

1. ...w $_SESSION['sklep.koszyk'][2]. - Pętla wykonuje raz dla $i = 0. Warunek z if nie jest spełniony, więc produkt dodaje się do $_SESSION['sklep.koszyk']. Break kończy wykonywanie pętli, nie dostajesz informacji o tym, że produkt istnieje w koszyku.
2. ...w $_SESSION['sklep.koszyk'][1]. - Dzieje się wszystko dokładnie tak samo, jak w sytuacji powyżej.
3. ...w $_SESSION['sklep.koszyk'][0]. - Pętla wykonuje się dla $i = 0. Warunek z if tym razem jest spełniony i echo wyświetla tekst, po czym pętla wykonuje się dla $i = 1. Tym razem warunek nie jest spełniony i następuje dodanie do koszyka i zakończenie pętli.

Przed pętlą stworzyłbym zmienną $znaleziono (Trzymając się Twojego nazewnictwa) i przypisał do niej wartość false i zmieniał ją tylko gdy produkt zostanie znaleziony. Następnie sprawdzał, wartość $znaleziono i wyświetlał informację/dodawał do tablicy.
rozny
Tak właśnie myślałem, że zrobiłem błąd w założeniu, ale jak się długo nad czymś siedzi to zazwyczaj logiczne postrzeganie zagadnienia ulatnia się z czasem smile.gif

Dzięki za pomysł ze zmienną dla zdarzenia "found" smile.gif Teraz wszystko działa jak należy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.