Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Usuwanie tablicy z tablicy wielowymiarowej
misteroous
post 1.12.2019, 02:38:52
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2019

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
viking
post 1.12.2019, 10:05:58
Post #2





Grupa: Zarejestrowani
Postów: 5 420
Pomógł: 923
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
misteroous
post 1.12.2019, 14:54:07
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2019

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
Tomplus
post 1.12.2019, 17:27:14
Post #4





Grupa: Zarejestrowani
Postów: 1 558
Pomógł: 184
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


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 )



Go to the top of the page
+Quote Post
misteroous
post 1.12.2019, 21:17:20
Post #5





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2019

Ostrzeżenie: (0%)
-----


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

Ten post edytował misteroous 1.12.2019, 22:00:08
Go to the top of the page
+Quote Post
Tomplus
post 1.12.2019, 22:15:14
Post #6





Grupa: Zarejestrowani
Postów: 1 558
Pomógł: 184
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Ale o tym już pisałem.

Zamiast używać FOR(), użyj FOREACH()
Go to the top of the page
+Quote Post
misteroous
post Wczoraj, 00:40
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2019

Ostrzeżenie: (0%)
-----


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 ;/?

Ten post edytował misteroous Wczoraj, 01:26
Go to the top of the page
+Quote Post
Tomplus
post Wczoraj, 06:32
Post #8





Grupa: Zarejestrowani
Postów: 1 558
Pomógł: 184
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


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');

Go to the top of the page
+Quote Post
misteroous
post Wczoraj, 15:28
Post #9





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2019

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
Tomplus
post Wczoraj, 15:58
Post #10





Grupa: Zarejestrowani
Postów: 1 558
Pomógł: 184
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post
misteroous
post Wczoraj, 22:51
Post #11





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2019

Ostrzeżenie: (0%)
-----


Faktycznie, dziękuje za pomoc @Tomplus smile.gif
Pomogła zmiana na:
  1. usun_koszyk($_SESSION['koszyk']['akcesoria']);

Pozdrawiam.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 6.12.2019 - 13:32