Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php]Nadpisywanie zmiennej
kristaps
post 26.12.2013, 01:46:04
Post #1





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


Witam, mam taki mały problem i chyba przez późną porę nie mogę wpaść na jakieś sensowne rozwiązanie.

Mam kod:

  1. if($_SESSION['idWholesale'] == 1){
  2.  
  3. $table = "<tr><td>".$data[0]."</td><td>".$data[1]."</td><td>".$data[2]."</td><td>".$data[3]."</td><td>".$data[4]."</td><td>".$data[5]."</td></tr>";
  4. $separator = ";";
  5. $firstLine = true;
  6. }
  7.  
  8. if($_SESSION['idWholesale'] == 2){
  9.  
  10. $table = "<tr><td>".$data[2]."</td><td>".$data[1]."</td><td>".$data[0]."</td><td>".$data[5]."</td></tr>";
  11. $separator = "|";
  12. $firstLine = true;
  13. }
  14.  
  15. echo "Podgląd: " . $_SESSION['nameWholesale'] . "</br>";
  16.  
  17. echo "<table>";
  18.  
  19. if (($handle = fopen($_SESSION['locationANDfile'], "r")) !== FALSE){
  20.  
  21.  
  22. while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE){
  23.  
  24. if($firstLine) {$firstLine = false; continue;}
  25.  
  26. $num = count($data);
  27. for ($c=0; $c < $num; $c++){
  28.  
  29. $data[$c];
  30.  
  31. }
  32.  
  33. echo $table;
  34.  
  35.  
  36. }
  37.  
  38. fclose($handle);


W zależności od wyboru w formularzu (idWholesale = 1, 2, itd.) chciałbym generować inne kolumny. Plik CSV rozdzielony jest separatorem, a ja chciałbym wybrać, które kolumny mają zostać wyświetlone.
Wszystko byłoby ok, gdyby nie fakt, że zmienna $table zawiera tablicę $data, a ta zmienna jest zarezerwowana dla

  1. $data = fgetcsv($handle, 1000, $separator)) !== FALSE
, więc po wygenerowaniu wynik jest pusty, chyba, że warunki if dam zaraz pod powyższym kodem.

Rozwiązanie pewnie jest proste, a ja najwidoczniej za długo na to patrzę.
Byłbym wdzięczny za pomoc.

Ten post edytował kristaps 26.12.2013, 01:47:15
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
Turson
post 26.12.2013, 10:55:52
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Jeśli nazwa zmiennej już istnieje i niepotrzebnie ją nadpisujesz to co za problem nazwać ją inaczej?
Go to the top of the page
+Quote Post
kristaps
post 26.12.2013, 15:19:52
Post #3





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


  1. if($_SESSION['idWholesale'] == 1){
  2.  
  3. $table = "<tr><td>".$data[0]."</td><td>".$data[1]."</td><td>".$data[2]."</td><td>".$data[3]."</td><td>".$data[4]."</td><td>".$data[5]."</td></tr>";

  1. ...

  1. while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE){

  1. ...

  1. $num = count($data);
  2. for ($c=0; $c < $num; $c++){
  3.  
  4. $data[$c]; // <------------
  5.  
  6. }


bo inaczej nie wyświetlę wyników.

Więc ktoś ma jakiś pomysł na to?

Ten post edytował kristaps 26.12.2013, 11:14:10
Go to the top of the page
+Quote Post
com
post 26.12.2013, 20:20:47
Post #4





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


nie bardzo widzę z czym Ty masz problem, pomijając:
  1. $num = count($data);
  2. for ($c=0; $c < $num; $c++){
  3.  
  4. $data[$c]; // <------------
  5.  
  6. }

fakt że ta pętla jest bez sensu , bo nic z tymi danymi w niej nie robisz ponadto prosi się o jakiś foreach a nie for smile.gif
Go to the top of the page
+Quote Post
kristaps
post 26.12.2013, 23:50:21
Post #5





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


Dzięki com za odpowiedź. Pętla faktycznie jest bez sensu, była mi wcześniej potrzebna i zapomniałem usunąć. To może inaczej:

W zależności co wybierzemy w formularzu tworzona jest sesja idWholesale. Więc IFem sprawdzam co zostało wybrane, a dla każdego są ustawione inne separatory, kolumny, itd. Zdjęcie lepiej to obrazuje:



Problem w tym, że echo $table zwraca mi tylko htmla zmiennej $table danego ifa. To pewnie przez to, że zmienna $data jest wykorzystywana wyżej

  1. while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE){
i jest nadpisywana.

Dlatego proszę o radę jak to obejść.

PS. Jeżeli dam warunki w pętlę to jest ok. No ale to nie rozwiązanie.

Ten post edytował kristaps 27.12.2013, 00:18:44
Go to the top of the page
+Quote Post
com
post 27.12.2013, 19:14:08
Post #6





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


bo do $table masz dopisywać a nie go zastępować czyli $table .=... wink.gif

poza tym $_SESSION['idWholesale'] zawiera przecież jakias liczbę wiec zwraca to który warunek spełnił, a nie wszystkie bo tylko 1 jest prawdziwy

Ten post edytował com 27.12.2013, 19:05:58
Go to the top of the page
+Quote Post
kristaps
post 27.12.2013, 22:04:39
Post #7





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


Cytat(com @ 27.12.2013, 19:14:08 ) *
poza tym $_SESSION['idWholesale'] zawiera przecież jakias liczbę wiec zwraca to który warunek spełnił, a nie wszystkie bo tylko 1 jest prawdziwy


No tak, ale warunek jest spełniany tylko raz. Czyli prawidłowo. Wybiera jedną z powyższych opcji (czerwona bądź czerwona kreska), czyli wszystko jest ok. Niestety dopisywanie również nie działa.

  1. if($_SESSION['idWholesale'] == 1){
  2. $separator = ";";
  3. $firstLine = true;
  4. $table .= '<tr><td>'.$data[0].'</td></tr>';
  5. }
  6.  
  7. if($_SESSION['idWholesale'] == 2){
  8. $separator = "|";
  9. $firstLine = true;
  10. $table .= "<tr><td>".$data[0]."</td><td>".$data[1]."</td></tr>";
  11. }
  12.  
  13. echo "Podgląd faktury z hurtowni: " . $_SESSION['nameWholesale'] . "<HR>";
  14.  
  15. echo "<table border = 1>";
  16.  
  17. if (($handle = fopen($_SESSION['locationANDfile'], "r")) !== FALSE){
  18.  
  19. while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE){
  20.  
  21. if($firstLine){$firstLine = false; continue;}
  22.  
  23.  
  24. echo $table;
  25.  
  26. }
  27.  
  28. fclose($handle);
  29.  
  30. echo "</table>";


Nadal zwraca tylko htmla.

Uprościłem maksymalnie kod:

Plik test.csv:

Cytat
nazwa;ilosc;cena;
pomidor;1;10;
jabłko;2;11;


Plik index.php

  1. $separator = ";";
  2. $firstLine = true;
  3. $table = '<tr><td>'.$data[0].'</td><td>'.$data[1].'</td></tr>';
  4.  
  5. echo "<table border = 1>";
  6.  
  7. if (($handle = fopen("test.csv", "r")) !== FALSE){
  8.  
  9. while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE){
  10.  
  11. if($firstLine){$firstLine = false; continue;}
  12.  
  13.  
  14. echo $table;
  15.  
  16. }
  17.  
  18. fclose($handle);
  19.  
  20. echo "</table>";
  21.  
  22. }


Byłbym bardzo wdzięczny gdybyś zerknął, bo być może źle opisuję problem. Zmienna $table (ta pierwsza) zwraca tylko htmla.

Ten post edytował kristaps 27.12.2013, 22:14:22
Go to the top of the page
+Quote Post
com
post 27.12.2013, 22:40:34
Post #8





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


bo ja Cie chyba źle zrozumiałem.. to co jest nie tak ?

tzn chodzi Ci że data[0] itd jest pusta? bo teraz jak na to patrze to Ty najpierw się odwołujesz do data a potem dopiero ją tworzysz ale może gdzieś ja tworzysz wcześniej tylko tego nie widzę..
Go to the top of the page
+Quote Post
kristaps
post 27.12.2013, 22:47:19
Post #9





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


Tak, jest pusta, pętla zwraca tylko htmla (<td></td>). No dokładnie, odwołuję się, wiem, że to raczej nie ma prawa działać, ale szukam sposobu na obejście tego. Bo tak jak wyżej pisałem i wklejałem kod, budowa tabel jest różna dla różnych wyborów w formularzu, a raczej bez sensu jest robić osobne pętle dla różnych $_SESSION['idWholesale'].
Go to the top of the page
+Quote Post
com
post 27.12.2013, 22:53:58
Post #10





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


poco chcesz robić oddzielne pętle?
foreach po data i dynamicznie dodajesz td tyle ile jest wystąpień w danej lini o ile dobrze widzę biggrin.gif
Go to the top of the page
+Quote Post
kristaps
post 27.12.2013, 22:57:24
Post #11





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


No właśnie nie. Bo różne $_SESSION['idWholesale'] to i różne separatory i budowa CSV. Tam gdzie w jednym pliku $date[0] oznacza nazwę towaru, to w innym załóżmy cenę. Dlatego trzeba to najpierw określić. smile.gif
Go to the top of the page
+Quote Post
com
post 27.12.2013, 23:02:02
Post #12





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


no to przecież ja wiem ale iteracja po data nie pyta się o to jaki masz separator czy $_SESSION['idWholesale'] bo zawartość data tworzysz tu
  1. while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE){ //etc }


A w kodzie który pokazałeś jedyna różnica jest w ilości komórek w wierszu przynajmniej ja to tak rozumie, a co oznacza $date[0] co tez nie jest ważne bo on przecież wydrukuje to co tam jest w tym array wink.gif

Ten post edytował com 27.12.2013, 23:02:38
Go to the top of the page
+Quote Post
kristaps
post 27.12.2013, 23:07:12
Post #13





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


Masz rację, ale niektóre wartości będą dodawane, mnożone, itd. A wtedy zaczynają się schody. Dlatego w tych warunkach IF, muszę później określić które to będą.
Go to the top of the page
+Quote Post
com
post 27.12.2013, 23:10:43
Post #14





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


no to teraz zmienia to wgl w zasadzie wszytko... To musisz to określić bo tak to nigdy nie dojdziemy do porozumienia biggrin.gif bo samo wyświetlenie jest proste ale operacje na danych tak już załatwić się nie da...
Go to the top of the page
+Quote Post
kristaps
post 27.12.2013, 23:20:12
Post #15





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


A co sugerujesz? Pierwotnie widziałem to tak:

  1.  
  2. if($_SESSION['idWholesale'] == 1){
  3.  
  4.  
  5. $suma_brutto = ($data[2] * $data[3]) * 1.23;
  6. $suma_brutto = round($suma_brutto, 2);
  7. $separator = ";";
  8. $firstLine = true;
  9. $table = '<tr><td>'.$data[0].'</td><td>'. $suma_brutto.'</td><td>'.$data[7].'</td></tr>';
  10. }
  11.  
  12. if($_SESSION['idWholesale'] == 2){
  13.  
  14. ----> A tutaj załóżmy podobne równanie, tylko na innych $data[] <----
  15. $separator = "|";
  16. $firstLine = true;
  17. $table = "<tr><td>".$data[0]."</td><td>".$data[1]."</td><td>".$data[2]."</td><td>".$data[3]."</td><td>".$data[4]."</td><td>".$data[5]."</td></tr>";
  18. }
  19.  
  20.  


Kwestia tego bym mógł określić to jeszcze przed wykonaniem pętli.

Ten post edytował kristaps 27.12.2013, 23:21:21
Go to the top of the page
+Quote Post
com
post 28.12.2013, 00:47:15
Post #16





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


teraz patrze na ten twój zrzut i widzę ze robisz to w klasie, to moje pytanie czy Ty to teraz chcesz wszytko robić w tej jednej metodzie? bo to trochę bez sensu.. zrób to tak pobierz jakaś metoda x data potem do wyświetlania masz ta co już masz, tylko dasz dane pobrane z metody x, a do tych operacji zrób nowa gdzie bd operował na danych które pobrałeś z metody x i tyle smile.gif
Go to the top of the page
+Quote Post
kristaps
post 28.12.2013, 03:01:26
Post #17





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


com, mógłbyś sklecić jakiś szybki kod, jak ewentualnie miałoby to wyglądać? Bo zrobiłem osobną funkcję, w której trzymam strukturę tabeli oraz resztę danych, ale nic się nie zmieniło - być może źle Cię zrozumiałem.
Go to the top of the page
+Quote Post
com
post 28.12.2013, 14:50:54
Post #18





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


a masz ten kod?

pseudo kod
  1. class cos
  2. {
  3. private $dane = [];
  4. private function get($data)
  5. {
  6. //tutaj pobierasz do $dane
  7. }
  8. public function show()
  9. {
  10. // tutaj wyświetlasz $dane
  11. }
  12. //itd
  13. }
Go to the top of the page
+Quote Post
kristaps
post 27.04.2014, 21:12:00
Post #19





Grupa: Zarejestrowani
Postów: 279
Pomógł: 36
Dołączył: 1.03.2012

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


Witam, muszę odkopać temat i wrócić do skończenia tego skryptu, dlatego proszę o pomoc. Streszczę cały ten wątek.

Chcę wyświetać różny układ tabel w jednej pętli - w zależności od wybranego pliku i opcji. Załóżmy mam plik.csv oraz plik2.csv

plik.csv

Separator: ;
Budowa pliku: nazwa towaru, ilość, cena
Kod
jabłko;2;11


plik2.csv

Separator: |
Budowa pliku: ilość, nazwa towaru, cena
Kod
2|jabłko|11


Niżej kod:
  1. if($_SESSION['idWholesale'] == 1){
  2.  
  3. $suma_brutto = ($data[1] * $data[2]) * 1.23;
  4.  
  5. $separator = ";";
  6. $firstLine = true;
  7. $table = '<tr><td>'.$data[0].'</td><td>'. $data[1].'</td><td>'.$suma_brutto.'</td></tr>';
  8. }
  9.  
  10. if($_SESSION['idWholesale'] == 2){
  11.  
  12. $suma_brutto = ($data[0] * $data[2]) * 1.23;
  13.  
  14. $separator = "|";
  15. $firstLine = true;
  16. $table = "<tr><td>".$data[1]."</td><td>".$data[0]."</td><td>'.$suma_brutto.'</td></tr>';
  17. }


Jak widać wyżej mnożymy na różnych $data, w zależności od tego jaką hurtownię wybiorę. No i mam pętlę i warunki:

  1. if (($handle = fopen($_SESSION['locationANDfile'], "r")) !== FALSE){
  2.  
  3. while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE){
  4.  
  5. if($firstLine){$firstLine = false; continue;}
  6. echo $table;
  7.  
  8. }
  9.  
  10. fclose($handle);
  11.  
  12. echo "</table>";


Skrypt wyświetla pustą tabelę html, bez danych. Błąd jest rzecz jasna w tym, że tablica
  1. $data
tworzona jest tutaj:

  1. $data = fgetcsv($handle, 1000, $separator)


Stąd moje pytanie jak to obejść, bo hurtowni mam sporo, a nie widzę sensu tworzenia osobnych pętli dla każdej z nich. com próbował pomóc, jednak nie do końca łapię jak miałbym zastosować jego ostatni post.

Będę wdzięczny za pomoc,
dzięki.

Ten post edytował kristaps 27.04.2014, 21:14:18
Go to the top of the page
+Quote Post
session
post 27.04.2014, 21:27:58
Post #20





Grupa: Zarejestrowani
Postów: 112
Pomógł: 22
Dołączył: 11.04.2010
Skąd: Tarnów

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


Nie orientuję się dobrze w Twoim temacie, ale z tego co widzę, najpierw deklarujesz parametry, a potem chcesz zastąpić zmienne, jednak PHP działa tak jakby od góry do dołu, więc wartości wykorzystywane w jednym miejscu nie będą dynamicznie aktualizowane jeśli gdzieś niżej zmienisz wartość zmiennej. Za to jest funkcja str_replace i możesz zrobić tak:
  1. $table = '<tr><td>%data0%</td><td>%data1%</td><td>%suma%</td></tr>';
  2. /* skrypt */
  3. str_replace('%data0%',$data[0],$table);
  4. str_replace('%data1%',$data[1],$table);


Natomiast co do sumy, możesz zmiennej $suma_brutto nadać jakieś wartości całkowite i korzystając ze switcha ( oczywiście switch w środku tej pętli, która czyta plik, i obliczoną wartość przypisujesz do $suma, a potem str_replace ) stosować odpowiednie obliczenia w zależności od tego jaką wartość ma $suma_brutto. Możesz również postąpić tak samo jak z $data korzystając z str_replace, a następnie zastoswać eval() (wiem może nie zbyt wydajne, ale za to będzie działać) tylko wtedy $suma_brutto ma być stringiem, a nie samymi obliczeniami.

W dodatku możesz śmiało dodać str_replace dla wszystkich elementów tablicy $data, ponieważ nawet jeśli nie będziesz z jakiejś korzystał to str_replace po prostu jej nie znajdzie.

Ten post edytował session 27.04.2014, 21:46:20
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 14.08.2025 - 14:04