Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Nadpisywanie zmiennej
Forum PHP.pl > Forum > PHP
kristaps
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.
Turson
Jeśli nazwa zmiennej już istnieje i niepotrzebnie ją nadpisujesz to co za problem nazwać ją inaczej?
kristaps
  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?
com
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
kristaps
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.
com
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
kristaps
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.
com
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ę..
kristaps
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'].
com
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
kristaps
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
com
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
kristaps
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ą.
com
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...
kristaps
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.
com
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
kristaps
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.
com
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. }
kristaps
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.
session
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.
kristaps
Session dzięki za próbę pomocy, ale sposób nie zadziała, jeżeli mówimy o pętli i większej ilości pozycji. Jakieś jeszcze pomysły?
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.