Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Usuwanie tablicy z tablicy wielowymiarowej
Forum PHP.pl > Forum > Przedszkole
misteroous
Witam serdecznie po raz drugi smile.gif

Tym razem mam problem a mianowicie gdy mam tablice wielowymiarową:
  1. [0] => Array ( [opis] => Wołowina w czerwonym curry [cena] => 25 [ilosc] => 1 )
  2. [1] => Array ( [opis] => Kurczak Kung Pao [cena] => 15 [ilosc] => 1 )
  3. [2] => Array ( [opis] => Kurczak Kung Pao [cena] => 15 [ilosc] => 1 )
  4. [3] => Array ( [opis] => Wołowina w czerwonym curry [cena] => 25 [ilosc] => 1 )
  5. [4] => Array ( [opis] => Wieprzowina w sosie teryaki [cena] => 50 [ilosc] => 1 )
  6. [5] => Array ( [opis] => Wieprzowina w sosie teryaki [cena] => 50 [ilosc] => 1 )
  7. )


Potrzebuje usunąć całą tablicę np. [0] i otrzymać:
  1. [0] => Array ( [opis] => Kurczak Kung Pao [cena] => 15 [ilosc] => 1 )
  2. [1] => Array ( [opis] => Kurczak Kung Pao [cena] => 15 [ilosc] => 1 )
  3. [2] => Array ( [opis] => Wołowina w czerwonym curry [cena] => 25 [ilosc] => 1 )
  4. [3] => Array ( [opis] => Wieprzowina w sosie teryaki [cena] => 50 [ilosc] => 1 )
  5. [4] => Array ( [opis] => Wieprzowina w sosie teryaki [cena] => 50 [ilosc] => 1 )
  6. )



Oto mój kod:
  1. function usun_produkt($akcesoria)
  2. {
  3. if (!isset($_POST['usun_produkt'])) {
  4. $akcesoria=$_SESSION['koszyk']['akcesoria'];
  5.  
  6. for($k=0;$k<count($akcesoria);$k++)
  7. {
  8. unset($akcesoria[$k]);
  9. }
  10. }
  11. }

ale nie działa, tzn. nie usuwa nic.
Ale gdy kod wygląda tak:
  1. function usun_produkt($akcesoria)
  2. {
  3. if (!isset($_POST['usun_produkt'])) {
  4. $akcesoria=$_SESSION['koszyk']['akcesoria'];
  5.  
  6. for($k=0;$k<count($akcesoria);$k++)
  7. {
  8. foreach(array_keys($akcesoria) as $k) {
  9. unset($akcesoria[$k][1]);
  10. }
  11. print_r($akcesoria[$k]); <------------------------- Array ( [0] => Array ( [opis] => Wieprzowina w sosie teryaki [cena] => 50 [ilosc] => 1 )
  12.  
  13. }
  14. }
  15. }

Wtedy usuwa ale tylko to co jest w print_r tzn.
  1. Array ( [0] => Array ( [opis] => Wieprzowina w sosie teryaki [cena] => 50 [ilosc] => 1 )

Ale nie usuwa tego z tablicy głównej.

Pomoże ktoś przerobić to tak, aby działało?
viking
Bo jak byś to zrobił tak ci ludzie mówili wcześniej (po id) to mógłbyś usuwać produkty z określonym id
$koszyk[tutaj_id]
Żeby usunąć pierwszy element https://www.php.net/manual/en/function.array-shift.php
misteroous
  1. function do_koszyka($akcesoria)
  2. {
  3. if (!isset($_POST['do_koszyka'])) return;
  4. if (count($_POST['towary'])===0) return;
  5. $towary=$_POST['towary'];
  6. foreach($towary as $towar)
  7. {
  8. $id=(int)(substr($towar,0,6)); <----------------------- tutaj jest id
  9. $klucz_cena='cena'.$id;
  10. $klucz_ilosc='ile'.$id;
  11. $typProduktu = 'akcesoria';
  12.  
  13. $count=count($_SESSION['koszyk'][$typProduktu]);
  14. $_SESSION['koszyk'][$typProduktu][$count]['opis'] = substr($towar,6); <---------------------------- czyli opis (nazwa) produktu to taki id poniewaz kazdy produkt ma inna nazwe.
  15. $_SESSION['koszyk'][$typProduktu][$count]['cena'] = $_POST[$klucz_cena];
  16. $_SESSION['koszyk'][$typProduktu][$count]['ilosc'] = $_POST[$klucz_ilosc];
  17. }
  18. }


Nie dałoby się po opisie usuwać takiego ciągu? [0] => Array ( [opis] => Kurczak Kung Pao [cena] => 15 [ilosc] => 1 ) gdzie [0] to $k
Tomplus
Pisałem Ci już.
ID to liczba.
ID może być ciągiem znaków, jak mówisz że to nazwa, ale jest to nie opłacalne.
Wszakże ID: "Kurczak Kung Pao" - usunięcie spowoduje usunięcie innych kurczaków z listy.

Ale jak już masz taką listę a nie inną, to co stoi na przeszkodzie, usunąć?

  1. function usun_produkt($akcesoria) {
  2. if (isset($_POST['usun_produkt'])) {
  3. unset($_SESSION['koszyk']['akcesoria'][$_POST['usun_produkt']]);
  4. }
  5. }


Przyjmuję że:
$_POST['usun_produkt'] zawiera wartość klucza twojej tablicy np. <button type='submit' name='usun_produkt' value='3'>Usuń</button> dla
[3] => Array ( [opis] => Wołowina w czerwonym curry [cena] => 25 [ilosc] => 1 )



misteroous
@Tomplus No super, rzeczywiście działa smile.gif no ale nie do końca jak bym chciał.
Faktycznie usuwa tak jak chciałem ale wywala mi błąd kiedy usune np. tablice z indeskem 0
  1. Undefined offset: 0
ponieważ tablica powinna sie na nowo przeindexować.
Wiesz może jak to zrobić?
Dziękuję i pozdrawiam.
Tomplus
Ale o tym już pisałem.

Zamiast używać FOR(), użyj FOREACH()
misteroous
ok problem z indeksowaniem mam z głowy dzięki funkcji array_values
  1. $akcesoria=$_SESSION['koszyk']['akcesoria'];

zmieniłem na:
  1. $akcesoria=array_values($_SESSION['koszyk']['akcesoria']);

i działa.
Czy możesz mi wytłumaczyć @Tomplus lub którykolwiek z użytkowników jak za pomocą przycisku
  1. <form action="" method="post"><button type="submit" name="usun_produkt" value='$jakasfunkcja'>-</button></form>

usuwać tylko tablice z danym opisem (nazwą?). Tzn. zamiast tablicy z indeksem [0] usuwało jedną tablicę z opisem "$opis" która ma z góry nie określony indeks.

Pozdrawiam i dziękuję za zainteresowanie tematem smile.gif

Witam i proszę o pomoc
Zrobiłem tak i działa ale usuwa produkt po ID dopiero po 2 kliknięciu, a jak chce usunąć inny produkt to najpierw usuwa poprzedni ID a dopiero po drugim kliknięciu właściwy ID.
Oto kod:
  1. function usun_koszyk($akcesoria)
  2. {
  3. if (isset($_POST['usun_koszyk'])) {
  4. $idd=$_POST['idproduktu'];
  5. foreach ( $akcesoria as $t => $item) {
  6. if ($item['id'] == $idd) {
  7. unset( $_SESSION['koszyk']['akcesoria'][$t]);
  8. $_SESSION['koszyk']['akcesoria']=array_values($_SESSION['koszyk']['akcesoria']);
  9. break;
  10. }
  11. }
  12. }
  13. }


Proszę powiedzcie co jest nie tak ;/?
Tomplus
Nie usuwa Ci po drugim kliknięciu, tylko już w pierwszym, ale wyświetlasz treść jeszcze przed 1szym kliknięciem.

Pewnie masz sytuację taką:

  1. /*
  2.   Kod który wyświetla treść
  3. */
  4.  
  5. /*
  6.   Kod który zmienia wartości tablic.
  7. */
  8.  
  9. /*
  10.   Kod który wyświetla inną treść
  11. */


Najprostszą metodą na upewnienie się co do poprawności treści to przekierowanie
  1. header('Location: /strona');

misteroous
Nie za bardzo rozumiem... Jeżeli dodaje tablice to działa dobrze ale kiedy już odejmuje to działa za ponownym wysłaniem bo za pierwszym razem usuwa poprzednie id. Mam nadzieje, że mnie rozumiesz.
Oto kod z koszyka:
  1. <?php
  2. do_koszyka(false);
  3. $akcesoria=$_SESSION['koszyk']['akcesoria'];
  4. usun_koszyk($akcesoria);
  5.  
  6. print_r($akcesoria);
  7.  
  8. echo '<br />';
  9. if (count($akcesoria)===0)
  10. {
  11. echo 'Twoje zamówienie jest puste!';
  12. return;
  13. }
  14.  
  15.  
  16. $l=1;
  17. $newKsiazki = [];
  18. if (count($akcesoria)>0)
  19. {
  20.  
  21.  
  22. foreach ($akcesoria as $akcesoria) {
  23. $opis = $akcesoria['opis'];
  24.  
  25. if (!isset($newKsiazki[$opis])) {
  26. $newKsiazki[$opis] = [
  27. 'id' => $akcesoria['id'],
  28. 'cena' => $akcesoria['cena'],
  29. 'ilosc' => 0
  30. ];
  31. }
  32.  
  33. $newKsiazki[$opis]['ilosc'] += $akcesoria['ilosc'];
  34.  
  35. }
  36. echo ' <br />';
  37. foreach ($newKsiazki as $opis => $akcesoria)
  38. {
  39. echo '<form method="post">'.($l++).'. <strong>'. $opis.'</strong>, cena: <strong><span style="color:brown">' .$akcesoria['cena'].'</span> zł</strong>'.', ilość: <strong>'.$akcesoria['ilosc'].'</strong>','&nbsp
  40.  
  41. <input type="hidden" name="id0" value='.$akcesoria['id'].' /><input type="checkbox" name="towary[]" value="000000'. $opis.'" checked hidden /><input type="submit" value="+" name="do_koszyka" /><input type="hidden" name="cena0" value='.$akcesoria['cena'].' /><input type="hidden" name="ile0" value="1" />
  42. <input type="hidden" name="idproduktu" value='.$akcesoria['id'].' /><button type="submit" name="usun_koszyk">-</button></form>
  43.  
  44.  
  45. ',"\n";
  46. }
  47. }
  48. ?>

A tu jeszcze raz funkcja usun_koszyk
  1. function usun_koszyk($akcesoria)
  2. {
  3. if (isset($_POST['usun_koszyk'])) {
  4. $idd=$_POST['idproduktu'];
  5. $akcesoria=$_SESSION['koszyk']['akcesoria'];
  6. foreach ( $akcesoria as $t => $item) {
  7. if ($item['id'] == $idd) {
  8. unset( $_SESSION['koszyk']['akcesoria'][$t]);
  9. $_SESSION['koszyk']['akcesoria']=array_values($_SESSION['koszyk']['akcesoria']);
  10. break;
  11. }
  12. }
  13. }
  14. }


@Tomplus mógłbyś to jaśniej wytłumaczyć? (O ile się da)
Tomplus
Spójrz na swój kod ponownie, a konkretnie na fragment:

  1. do_koszyka(false);
  2. $akcesoria=$_SESSION['koszyk']['akcesoria'];
  3. usun_koszyk($akcesoria);


najpierw przypisujesz koszyk do zmiennej $akcesoria, a potem usuwasz z sesji klucz z tablicy.

Czyli nie wciąż do dalszego kodu używasz tylko i wyłącznie to co jest w $akcesoria. Wartość z funkcji usun_koszyk() będzie dopiero po przeładowaniu, bo tam modyfikujesz wartość sesyjną.
misteroous
Faktycznie, dziękuje za pomoc @Tomplus smile.gif
Pomogła zmiana na:
  1. usun_koszyk($_SESSION['koszyk']['akcesoria']);

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