Witam serdecznie wszystkich użytkowników.
Jestem nowy na forum i od razu zaznaczę że dopiero zaczynam przygodę z PHP.
Wracając jednak do tematu, potrzebuję pomocy w przerobieniu skryptu aby po dodaniu jednego produktu do koszyka zmieniał tylko liczbę z ilości:1 na 2, 3 itd. ponieważ póki co, zapisuję produkt jeden pod drugim po prostu w ilości:1.
Jeżeli źle się wyraziłem lub nie do końca jest jest jasne to co napisałem, to chętnie odpowiem na wszystkie pytania.
Poniżej przedstawiam skrypt i liczę na pomoc.
<?php do_koszyka(false); $akcesoria=$_SESSION['koszyk']['akcesoria']; http://www.php.net/echo '<br />'; if (http://www.php.net/count($akcesoria)===0) { http://www.php.net/echo 'Twoje zamówienie jest puste!'; return; } $suma=0; if (http://www.php.net/count($akcesoria)>0) { http://www.php.net/echo '<br /> <br />'; for($k=0;$k<count($akcesoria);$k++) { $suma+=$akcesoria[$k]['cena']*$akcesoria[$k]['ilosc']; http://www.php.net/echo ($k+1).'. <strong>'.$akcesoria[$k]['opis'].'</strong>, cena: <strong><span style="color:brown">'.$akcesoria[$k]['cena'].'</span> zł</strong>'.', ilość: '.$akcesoria[$k]['ilosc'].'<br />'."\n"; } } ?>
Chcesz liczbę unikalnych produktów w koszyku?
To chyba u Ciebie ta linia rozwiązuje ten problem: count($akcesoria)
Tylko, że gdy dodam dwa razy produkt po 1 to wyświetla mi je jako oddzielne produkty po 1 a nie sumuje jako jeden produkt w ilości: 2
Przykład:
Czerwona koszulka, cena: 15 zł, ilość: 1
Czerwona koszulka, cena: 15 zł, ilość: 1
Zamiast:
Czerwona koszulka, cena: 15 zł, ilość: 2
To zamiast $akcesoria[$k] używaj $akcesoria[$produkId]
Zamiast for() użyj foreach()
Posortuj sobie wg klucza przed foreach() a następnie:
$iloscProduktow = 0; foreach($akcesoria as $produktId => $var) if($ostatniProdukt != $produkId) { $iloscProduktow++; } $ostatniProdukt = $produktId; /* resta danych pętli np .$var['cena'] */ }
Niestety nie - wszystko odbywa się w php.
Dziękuje za odpowiedź.
Spróbuje pokombinować według twojego przykładu.
Niestety jakoś nie mogę tego ogarnąć... Może to dlatego, że próbuje to zrobić cały dzień
Skrypt w którym odbywa się ta funkcja dodawania wygląda tak:
function do_koszyka($ksiazki) { if (!http://www.php.net/isset($_POST['do_koszyka'])) return; if (http://www.php.net/count($_POST['towary'])===0) return; $towary=$_POST['towary']; foreach($towary as $towar) { $id=(int)(http://www.php.net/substr($towar,0,6)); $klucz_cena='cena'.$id; $klucz_ilosc='ile'.$id; if ($ksiazki) { $count=http://www.php.net/count($_SESSION['koszyk']['ksiazki']); $_SESSION['koszyk']['ksiazki'][$count]['opis']=http://www.php.net/substr($towar,6); $_SESSION['koszyk']['ksiazki'][$count]['cena']=$_POST[$klucz_cena]; $_SESSION['koszyk']['ksiazki'][$count]['ilosc']=$_POST[$klucz_ilosc]; } else { $count=http://www.php.net/count($_SESSION['koszyk']['akcesoria']); $_SESSION['koszyk']['akcesoria'][$count]['opis']=http://www.php.net/substr($towar,6); $_SESSION['koszyk']['akcesoria'][$count]['cena']=$_POST[$klucz_cena]; $_SESSION['koszyk']['akcesoria'][$count]['ilosc']=$_POST[$klucz_ilosc]; } } }
Jakbyś podał jeszcze przykładową zawartość $_POST bo wygląda to tak jakbyś miał nazwę produktu: 123456DługopisBezbarwny
Wiesz że warto pomyśleć o nie używaniu powtórzeń tego samego kodu?
np. linie 11-24 powyższego kodu można zamienić na:
$typProduktu = $ksiazki ? 'ksiazki' : 'akcesoria'; $count = http://www.php.net/count($_SESSION['koszyk'][$typProduktu]); $_SESSION['koszyk'][$typProduktu][$count]['opis'] = http://www.php.net/substr($towar,6); $_SESSION['koszyk'][$typProduktu][$count]['cena'] = $_POST[$klucz_cena]; $_SESSION['koszyk'][$typProduktu][$count]['ilosc'] = $_POST[$klucz_ilosc];
Masz rację zmienna $ksiazki nie jest potrzebna.
Pokierowałem się twoim przykładem i kod działa bez zarzutu:
function do_koszyka($akcesoria) { if (!http://www.php.net/isset($_POST['do_koszyka'])) return; if (http://www.php.net/count($_POST['towary'])===0) return; $towary=$_POST['towary']; foreach($towary as $towar) { $id=(int)(http://www.php.net/substr($towar,0,6)); $klucz_cena='cena'.$id; $klucz_ilosc='ile'.$id; $typProduktu = 'akcesoria'; $count=http://www.php.net/count($_SESSION['koszyk'][$typProduktu]); $_SESSION['koszyk'][$typProduktu][$count]['opis'] = http://www.php.net/substr($towar,6); $_SESSION['koszyk'][$typProduktu][$count]['cena'] = $_POST[$klucz_cena]; $_SESSION['koszyk'][$typProduktu][$count]['ilosc'] = $_POST[$klucz_ilosc]; } }
Teraz patrząc po Twoim kodzie to nie potrzebna jest w funkcji argument $akcesoria.
No dobrze udało mi się to zrobić w taki sposób, że kiedy
<?php $text=[ "1||Kurczak Kung Pao", "1||Kurczak Kung Pao", "1||Wołowina w czerwonym curry", "1||Wołowina w czerwonym curry", ]; $sum = []; foreach($text as $row) { list($value,$name) = http://www.php.net/explode("||", $row); if(!http://www.php.net/isset($sum[$name])){ $sum[$name] = 0; } $sum[$name] += $value; } http://www.php.net/var_dump($sum); ?>
http://www.php.net/array(2) { ["Kurczak Kung Pao"]=> int(2) ["Wołowina w czerwonym curry"]=> int(2) }
<?php $text=[ http://www.php.net/array_map(function ($var) { http://www.php.net/echo "<br />", "\n",'"' .$var['ilosc'], "||", $var['opis']. '"',","; }, $arr) ]; $sum = []; foreach($text as $row) { list($value,$name) = http://www.php.net/explode("||", $row); if(!http://www.php.net/isset($sum[$name])){ $sum[$name] = 0; } $sum[$name] += $value; } http://www.php.net/var_dump($sum); ?>
daję identyczną wartość co:
http://www.php.net/array_map(function ($var) { http://www.php.net/echo "<br />", "\n",'"' .$var['ilosc'], "||", $var['opis']. '"',","; }, $arr);
"1||Kurczak Kung Pao", "1||Kurczak Kung Pao", "1||Wołowina w czerwonym curry", "1||Wołowina w czerwonym curry",
Warning: http://www.php.net/explode() expects parameter 2 to be string, http://www.php.net/array given in
<?php $text=[ http://www.php.net/array_map(function ($var) { http://www.php.net/echo "<br />", "\n",'"' .$var['ilosc'], "||", $var['opis']. '"',","; }, $arr) ];
<?php $text=[ http://www.php.net/array_map(function ($var) { return "<br />", "\n",'"' .$var['ilosc'], "||", $var['opis']. '"',","; }, $arr) ];
Przemyśl czy jest sens tworzyć treści w postaci:
Ilosc||Nazwa
bo dużo wygodniejsze jest praca na tablicy:
korzystając z funkcji json_encode($array) i json_decode($stringJson, true)
$tablica = http://www.php.net/array('Jan Serce', 'Maria Dąbrowska', 'Bolesław Chrobry', 'Zygmunt III Waza', 'Bolesław Chrobry', 'Maria Dąbrowska', 'Fryderyk Chopin', 'Jan Serce', 'Zygmunt III Waza', 'Bolesław Chrobry', 'Fryderyk Chopin', 'Zygmunt III Waza', 'Roman Wilhelmi'); $tbl = http://www.php.net/array_count_values($tablica); http://www.php.net/arsort($tbl); foreach($tbl as $kl => $val) { http://www.php.net/echo 'Nazwa <b>' . $kl . '</b> występuje <b>' . $val . '</b> raz/y.<br>'; }
Dziękuję wszystkim za zainteresowanie.
@Lord próbując twoim przykładem wyskakuję mi błąd:
Parse error: syntax error, unexpected ','
http://www.php.net/array_map(function ($var) { http://www.php.net/echo "<br />", "\n",'"' .$var['ilosc'], "||", $var['opis']. '"',","; }, $arr);
Parse error: syntax error, unexpected ','
http://www.php.net/array_map(function ($var) { http://www.php.net/echo "<br />", "\n",'"' .$var['ilosc'], "||", $var['opis']. '"',","; }, $arr);
$a. ' - '.$b
Dobrze, poprawiłem to tak:
$text=[ http://www.php.net/array_map(function ($var) { return "<br />". "\n".'"' .$var['ilosc']. "||". $var['opis']. '"'.","; }, $arr) ];
Warning: http://www.php.net/explode() expects parameter 2 to be string, http://www.php.net/array given in
$text=[ http://www.php.net/array_map(function ($var) { return "<br />". "\n".'"' .$var['ilosc']. "||". $var['opis']. '"'.","; }, $arr) ]; $sum = []; foreach($text as $row) { list($value,$name) = http://www.php.net/explode("||", $row); <========== TUTAJ if(!http://www.php.net/isset($sum[$name])){ $sum[$name] = 0; } $sum[$name] += $value; } http://www.php.net/var_dump($sum);
Po grzyba tworzysz tablice w tablicy?
nie
$text=[
array_map(function ($var) {
return "<br />". "\n".'"' .$var['ilosc']. "||". $var['opis']. '"'.",";
}, $arr)
];
a:
$text=
array_map(function ($var) {
return "<br />". "\n".'"' .$var['ilosc']. "||". $var['opis']. '"'.",";
}, $arr)
;
A tak w ogole po grzyba przeksztalcasz tablice na tekst, tylko po to by pare linijek nizej ten tekst przeksztalcic na te sama tablice? Przeciez to nie ma zadnego sensu
@nospor
Kiedy robię tak jak napisałeś, otrzymuje:
Warning: A non-numeric value encountered in
Ja napisalem, caly ten kod jest do 4 liter - bez obrazy.Nie ma zadnej logiki anie sensu.
Zamiast zamieniac $arr na tablice tekstow, to iteruj bezposrednio po $arr i sobie sumuj co masz sumowac. Nie ma sensu poprawiac tego co tu teraz stworzyles bo to tylko marnowanie czasu
wklej kod co Ty tam robisz teraz
Nie obrażam się, napisałem, że jestem początkujący i to bardzo. Ten skrypt nie jest mój, ja tylko staram się go przerobić.
Wkleję wam oryginalny skrypt a wy postarajcie się może w miarę swoich możliwości podpowiedzieć co mam zrobić żeby działało tak jak trzeba...
Plik php.php: <?php function poczatek_sesji() { @http://www.php.net/session_start(); if (!http://www.php.net/isset($_SESSION['koszyk'])) { $_SESSION['koszyk']=http://www.php.net/array('ksiazki'=>array(),'akcesoria'=>array()); } } function do_koszyka($ksiazki) { if (!http://www.php.net/isset($_POST['do_koszyka'])) return; if (http://www.php.net/count($_POST['towary'])===0) return; $towary=$_POST['towary']; foreach($towary as $towar) { $id=(int)(http://www.php.net/substr($towar,0,6)); $klucz_cena='cena'.$id; $klucz_ilosc='ile'.$id; if ($ksiazki) { $count=http://www.php.net/count($_SESSION['koszyk']['ksiazki']); $_SESSION['koszyk']['ksiazki'][$count]['opis']=http://www.php.net/substr($towar,6); $_SESSION['koszyk']['ksiazki'][$count]['cena']=$_POST[$klucz_cena]; $_SESSION['koszyk']['ksiazki'][$count]['ilosc']=$_POST[$klucz_ilosc]; } else { $count=http://www.php.net/count($_SESSION['koszyk']['akcesoria']); $_SESSION['koszyk']['akcesoria'][$count]['opis']=http://www.php.net/substr($towar,6); $_SESSION['koszyk']['akcesoria'][$count]['cena']=$_POST[$klucz_cena]; $_SESSION['koszyk']['akcesoria'][$count]['ilosc']=$_POST[$klucz_ilosc]; } } } function pusty_koszyk() { if (!http://www.php.net/isset($_POST['pusty_koszyk'])) return; $_SESSION['koszyk']['ksiazki']=http://www.php.net/array(); $_SESSION['koszyk']['akcesoria']=http://www.php.net/array(); http://www.php.net/echo '<br />Koszyk jest pusty!'; } function pokaz_koszyk() { if (!http://www.php.net/isset($_POST['pokaz_koszyk'])) return; $ksiazki=$_SESSION['koszyk']['ksiazki']; $akcesoria=$_SESSION['koszyk']['akcesoria']; http://www.php.net/echo '<br />'; if (http://www.php.net/count($ksiazki)===0 && http://www.php.net/count($akcesoria)===0) { http://www.php.net/echo 'Koszyk jest pusty!'; return; } $suma=0; if (http://www.php.net/count($ksiazki)>0) { http://www.php.net/echo 'Książki:<br />'; for($k=0;$k<count($ksiazki);$k++) { $suma+=$ksiazki[$k]['cena']*$ksiazki[$k]['ilosc']; http://www.php.net/echo ($k+1).'. '.$ksiazki[$k]['opis'].', cena: ' .$ksiazki[$k]['cena'].', ilość: '.$ksiazki[$k]['ilosc'].'<br />'."\n"; } } if (http://www.php.net/count($akcesoria)>0) { http://www.php.net/echo '<br />Akcesoria:<br />'; for($k=0;$k<count($akcesoria);$k++) { $suma+=$akcesoria[$k]['cena']*$akcesoria[$k]['ilosc']; http://www.php.net/echo ($k+1).'. '.$akcesoria[$k]['opis']. ', cena: '.$akcesoria[$k]['cena'].', ilość: '.$akcesoria[$k]['ilosc'].'<br />'."\n"; } } http://www.php.net/echo '<br />Wartość towarów w koszyku: '.$suma; } ?> Plik sklep.php <?php include('php.php'); poczatek_sesji(); ?> <!doctype html> <html> <head> <title>Testowanie skryptów PHP</title> <meta charset="utf-8" /> </head> <body> <h1>Sklep internetowy</h1> <p><a href="ksiazki.php">Książki</a></p> <p><a href="akcesoria.php">Akcesoria</a></p> <br /> <form action="sklep.php" method="post"> <input type="submit" name="pusty_koszyk" value="Pusty koszyk" /> <input type="submit" name="pokaz_koszyk" value="Pokaż koszyk" /> </form> <?php pusty_koszyk(); pokaz_koszyk(); ?> </body> </html> Plik ksiazki.php <?php include('php.php'); poczatek_sesji(); ?> <!doctype html> <html> <head> <title>Testowanie skryptów PHP</title> <meta charset="utf-8" /> </head> <body> <h1>Książki</h1> <p><a href="sklep.php">Sklep</a></p> <p><a href="akcesoria.php">Akcesoria</a></p> <br /> <form action="ksiazki.php" method="post"> <p> <label><input type="checkbox" name="towary[]" value="000000Jak zdać egzamin, autor: Józef Nauczyciel" /> Jak zdać egzamin, autor: Józef Nauczyciel </label> , cena<input type="text" name="cena0" value="20" style="width:30px;" /> , ilość<input type="text" name="ile0" style="width:30px;" /> </p> <p> <label><input type="checkbox" name="towary[]" value="000001Podstawy PHP, autor: Jan Mądry" /> Podstawy PHP, autor: Jan Mądry </label> , cena<input type="text" name="cena1" value="40" style="width:30px;" /> , ilość<input type="text" name="ile1" style="width:30px;" /> </p> <p> <label><input type="checkbox" name="towary[]" value="000002HTML 5, autor: Piotr Programista" /> HTML 5, autor: Piotr Programista </label> , cena<input type="text" name="cena2" value="60" style="width:30px;" /> , lość<input type="text" name="ile2" style="width:30px;" /> </p> <input type="submit" name="do_koszyka" value="Do koszyka" /> <input type="submit" name="pusty_koszyk" value="Pusty koszyk" /> <input type="submit" name="pokaz_koszyk" value="Pokaż koszyk" /> </form> <?php do_koszyka(true); pusty_koszyk(); pokaz_koszyk(); ?> </body> </html> Plik akcesoria.php <?php include('php.php'); poczatek_sesji(); ?> <!doctype html> <html> <head> <title>Testowanie skryptów PHP</title> <meta charset="utf-8" /> </head> <body> <h1>Akcesoria</h1> <p><a href="sklep.php">Sklep</a></p> <p><a href="ksiazki.php">Książki</a></p> <br /> <form action="akcesoria.php" method="post"> <p> <label><input type="checkbox" name="towary[]" value="000000Płyta główna" /> Płyta główna </label> , cena<input type="text" name="cena0" value="200" style="width:30px;" /> , ilość<input type="text" name="ile0" style="width:30px;" /> </p> <p> <label><input type="checkbox" name="towary[]" value="000001Procesor" /> Procesor </label> , cena<input type="text" name="cena1" value="300" style="width:30px;" /> , ilość<input type="text" name="ile1" style="width:30px;" /> </p> <p> <label><input type="checkbox" name="towary[]" value="000002Karta graficzna" /> Karta graficzna </label> , cena<input type="text" name="cena2" value="120" style="width:30px;" /> , lość<input type="text" name="ile2" style="width:30px;" /> </p> <input type="submit" name="do_koszyka" value="Do koszyka" /> <input type="submit" name="pusty_koszyk" value="Pusty koszyk" /> <input type="submit" name="pokaz_koszyk" value="Pokaż koszyk" /> </form> <?php do_koszyka(false); pusty_koszyk(); pokaz_koszyk(); ?> </body> </html>
Akcesoria: 1. Płyta główna, cena: 200, ilość: 2 Wartość towarów w koszyku: 400
Akcesoria: 1. Płyta główna, cena: 200, ilość: 1 2. Płyta główna, cena: 200, ilość: 1 Wartość towarów w koszyku: 400
czy w tablicy $ksiazki jest w ogole jakis jej identyfikator? Bo OPIS ciezko uznac za takowy
A dokładnie o jaki identyfikator ci chodzi i jak miałby on wyglądać i do czego miałbym go użyć?
Pytam bo jestem zielony
Czemu opis nie? Niech sumuje wszystkie te same opisy z przypisaną do nich ilością.
Bo teoretycznie opis moze byc taki sam dla roznych ksiazek. Identyfikator z nazwy jest unikalny
U mnie opis jest unikalny dla każdego produktu więc nie ma problemu
@edit
naprawdę tak jak ja nikt nie ma pomysłu jak to zrobić?
To ze ktos nie odpisuje, nie znaczy ze nie ma pomyslu. Moze np poprostu mu sie nie chciec lub nie miec czasu
Pomysl ci juz dawno napisalem...
$newKsiazki = []; foreach ($ksiazki as $ksiazka) { $opis = $ksiazka['opis']; if (!http://www.php.net/isset($newKsiazki[$opis])) { $newKsiazki[$opis] = [ 'cena' => $ksiazka['cena'], 'ilosc' => 0 ]; } $newKsiazki[$opis]['ilosc'] += $ksiazka['ilosc']; } http://www.php.net/echo 'Książki:<br />'; foreach ($newKsiazki as $opis => $ksiazka) { http://www.php.net/echo $opis.', cena: ' .$ksiazka['cena'].', ilość: '.$ksiazka['ilosc'].'<br />'."\n"; }
IDENTYFIKATOR - w skrócie `id` - zwykle unikalne, nie zmienialne liczbowe określenie pojedynczej jednostki zasobu.
U Ciebie opis wcześniej czy później możesz zmienić np. stwierdzisz że w opisie musi być autor, marka etc, albo stwierdzisz że będziesz musiał wyświetlić skróconą nazwę.
Dzięki używaniu ID, nie musisz się przejmować nazwami. Czytelniejszy jest odczyt i zapis, następnie tworzenie potencjalnych statystyk sprzedaży.
Dziękuję ci nospor
Skrypt działa temat można zamknąć.
Dałem pomógł bo tylko tak mogę się odwdzięczyć.
Jeszcze raz dziękuję za pomoc. Pozdrawiam
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)