Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [php]Nadpisywanie zmiennej
kristaps
post
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
Turson
post
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
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
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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kristaps
post
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:

(IMG:http://s4.ifotos.pl/img/Bez-nazwy_nqqrwwa.jpg)

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
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 .=... (IMG:style_emoticons/default/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
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
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
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
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ę (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
kristaps
post
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ć. (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
com
post
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 (IMG:style_emoticons/default/wink.gif)

Ten post edytował com 27.12.2013, 23:02:38
Go to the top of the page
+Quote Post
kristaps
post
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
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 (IMG:style_emoticons/default/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
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
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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kristaps
post
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
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
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
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
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 22:15