Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Generowane warunki IF na podstawie zawartości tablicy w pętli WHILE?
Forum PHP.pl > Forum > PHP
bebzon_hc
Witam serdecznie!
Mam takie pytanie. Magluję to już cały wieczór a nie wiem czy da się coś takiego zrobić hehe

Aktalnie mam coś takiego:
  1. $expStringN = explode(';', $newspapersString); // POBIERAMY STRINGA I ROZBIJAMY GO NA TABLICE POPRZEZ ZNAK ŚREDNIKA
  2.  
  3. $strN = '';
  4.  
  5. $expStringNFilter = array_filter($expStringN,array($this, "notNull"));
  6.  
  7. foreach ($expStringNFilter as $strKey => $strValue)
  8. {
  9. if ($strValue == 0) {$newspaperName = "A<br/>";};
  10. if ($strValue == 1) {$newspaperName = "B<br/>";};
  11. if ($strValue == 2) {$newspaperName = "C<br/>";};
  12. if ($strValue == 3) {$newspaperName = "D<br/>";};
  13. if ($strValue == 4) {$newspaperName = "E<br/>";};
  14. if ($strValue == 5) {$newspaperName = "F<br/>";};
  15. $strN .= $newspaperName;
  16. };
  17.  
  18. return $strN;


Ten kod mi działa... jednak moje pytanie brzmi czy mogę te IF'y wygenerować na podstawie zawartości tablicy np. GAZETY? W zależności od tego ile jest tytułów gazet w tablicy to tyle i takie robi warubki IF.
Żeby było jasne jedna instrukcja warunkowa to jeden rekord. W kodzie powyżej wpisałem sobie ręcznie, ale fajnie byłoby gdyby w razie dodania kolejnego tytułu gazety nietrzebabyłoby ręcznie poprawiać kodu tylko automatycznie by się to generowało na podstawie bazy danych.

Pozdrawiam
redeemer
Może
  1. $strN .= chr(65+$strValue).'<br />';
+ obsługa warunków brzegowych?
bebzon_hc
hehehe ale zapodałeś smile.gif pogrzebałem po internecie i pojęcie "warunek brzegowy" przedstawiony jest bardziej jako pojęcie typowo matematyczne. Nie znalazłem nic nawiązującego np. do php ;/ Mógłbyś bardziej naświetlić sprawę ? Ciężki temat...

P.S Włąsnie sprawdziłem te Twoje rozwiązanie z "chr(65 + $strValue)" hehe i pokazuje mi same literki. Tytuły będą ciągami różnych znaków. np. Fakt, Telexpres, itp.
redeemer
No to trzymaj te tytuły w bazie danych.
bebzon_hc
no mam w bazie danych smile.gif ale przypuśćmy, że klient wyświetli 100 rekordow na stronie. W każdym rekordzie będzie np. ;0;1;2;4; i dla każdej cyferki z tego ciągu mam robić zapytanie do bazy ?
SELECT newspaper_name FROM XXX WHERE id = 0;itd. ? w najgorszym przypadku gdzie rekord ma ;0;1;2;3;4; * 100 rekordów na wyświetlenie to 500 zapytań.
redeemer
Nie za bardzo rozumiem. Co za problem dodać albo kolumnę z nazwą gazety albo dopisać do zapytania JOINa z tabelą z nazwami.
bebzon_hc
Ok podstaram się przedstawić wszystko od początku. Problem pewnie jest banalny hehe. Tyle przy tym siedze, że nie widzę już tego.

  1. /* *** ZAPYTANIE SQL - WYCIĄGA WSZYSTKIE ZLECENIA - TO JEST OK! *** */
  2. public function selectOrdersByOffice($office)
  3. {
  4. $this->connectDB();
  5. $dbResult = @mysql_query(" SELECT oc.id_order, DATE_FORMAT(oc.date, '%d-%m-%Y') AS date, DATE_FORMAT(oc.date, '%H:%i') AS time, u.name, u.surname, c.firm_name, m.module_name, oc.edition_number, oc.newspapers FROM orders_current AS oc INNER JOIN users AS u ON oc.users_id_user = u.id_user INNER JOIN clients AS c ON oc.clients_id_client = c.id_client AND u.offices_id_office = ".$office." INNER JOIN modules AS m ON oc.modules_id_module = m.id_module; ") or die('Błąd zapytania - select eventu zlecenia.');
  6. return($dbResult);
  7. $this->releaseDB();
  8. }


  1. /* *** ZAPYTANIE SQL - Z TABLICY KLUCZ I WARTOŚĆ [ID + TYTUŁ] - TO JEST OK! *** */
  2. public function selectAllNewspapers()
  3. {
  4. $this->connectDB();
  5. $dbResult = @mysql_query("SELECT id_newspaper, newspaper_name FROM newspapers") or die('Błąd zapytania - select wszystkich gazet.');
  6. return($dbResult);
  7. $this->releaseDB();
  8. }


  1. /* *** FORMULARZ GENERUJE W TABELI LISTĘ WSZYSTKICH ZLECEŃ *** */
  2. <form class="" action="" method="POST" name="zleceniaPrzegladajForm">
  3. <?php echo "<div style=\"position: absolute; top: 5px; left: 220px;\">".$btnUsunZlecenie."</div>";?>
  4. <?php
  5. $office = $_SESSION['offices_id_office'];
  6. $ordersByOffice = $dbh->selectOrdersByOffice($office);
  7. $num_rows = mysql_num_rows($ordersByOffice);
  8.  
  9. $selectAllNewspapers = $dbh->selectAllNewspapers();
  10. $selectAllNewspapersArray = mysql_fetch_array($selectAllNewspapers);
  11.  
  12. if ($num_rows > 0) // jeśli coś znalazło
  13. {
  14. ?>
  15. <table width="100%" border="0" cellspacing="0" cellpadding="0" class="classicTable">
  16. <thead>
  17. <tr>
  18. <th width="20"></th>
  19. <th>NAZWA FIRMY</th>
  20. <th>MODUŁ</th>
  21. <th>NUMERY GAZET</th>
  22. <th>GAZETY</th>
  23. <th>ZLECENIOBIORCA</th>
  24. <th>DATA WPROWADZENIA</th>
  25. </tr>
  26. </thead>
  27. <tbody>
  28. <?php
  29. while ($ordersByOfficeArray = mysql_fetch_array($ordersByOffice))
  30. {
  31. echo "<tr><th><input name=\"id_order\" type=\"radio\" class=\"\" value=\"".$ordersByOfficeArray['id_order']."\"></th>
  32. <td>".$ordersByOfficeArray['firm_name']."</td>
  33. <td>".$ordersByOfficeArray['module_name']."</td>
  34. <td>".$ordersByOfficeArray['edition_number']."</td>
  35. /* LINIA PONIŻEJ - ZROBIŁEM KLASĘ W KTÓRY WRZUCAM np. (;0;1;2;3;4; , TABLICA Z WSZYSTKIMI [ID + TYTUŁY]) MYŚLĘ, ŻE TU JEST BŁĄD... */
  36. <td>".$decodeNewspaper->decodeN($ordersByOfficeArray['newspapers'],$selectAllNewspapersArray)."</td>
  37. <td>".$ordersByOfficeArray['name']." ".$ordersByOfficeArray['surname']."</td>
  38. <td>".$ordersByOfficeArray['date']."</td>
  39. </tr>";
  40. };
  41.  
  42. ?>
  43. </tbody>
  44. </table>
  45. </form>


  1. /* *** KLASA decodeNewspaper - TUTAJ UZYSKUJE WYNIK WIZUALNY TAKI JAKI CHCĘ :) TYLKO ŻE TE WARUNKI IF SĄ Z RĘKI WPISANE. CHCIAŁEM ŻEBY BYŁY GENEROWANY NA PODSTAWIE TABLICY [ID + TYTUŁY] *** */
  2. class decodeNewspaper
  3. {
  4. private function notNull($var) { return($var != null);} // NIE RUSZAĆ
  5.  
  6. public function decodeN($newspapersString,$selectAllNewspapersArray)
  7. {
  8. $expStringN = explode(';', $newspapersString);
  9. $strN = '';
  10. $expStringNFilter = array_filter($expStringN,array($this, "notNull"));
  11. foreach ($expStringNFilter as $strKey => $strValue)
  12. {
  13. /* **** START - MOJE WCZEŚNIEJSZA PROPOZYCJA - tylko że tutaj wpisałem z palca te warunki.**** */
  14. if ($strValue == 0) {$newspaperName = "Życie Rawicza<br/>";};
  15. if ($strValue == 1) {$newspaperName = "Życie Gostynia<br/>";};
  16. if ($strValue == 2) {$newspaperName = "Gazeta Jarocińska<br/>";};
  17. if ($strValue == 3) {$newspaperName = "Życie Pleszewa<br/>";};
  18. if ($strValue == 4) {$newspaperName = "Gazeta Krotoszyńska<br/>";};
  19. if ($strValue == 5) {$newspaperName = "Wieści Rolnicze<br/>";};
  20.  
  21. $strN .= $newspaperName;
  22. /* **** KONIEC - MOJE WCZEŚNIEJSZA PROPOZYCJA **** */
  23.  
  24. };
  25.  
  26. return $strN;
  27. }
  28. };



I teraz PROBLEM:
Z Ciągu znaków $ordersByOfficeArray['newspapers']
który dla każdego zlecenia wygląda np. tak: ;0;2;3;4;
zrobiło na podtsawie tablicy z zapytania $selectAllNewspapersArray
którego wynik wygląda tak:
  1. + ----------------- + ------------------- +
  2. | id_newspaper | newspaper_name |
  3. + ----------------- + ------------------- +
  4. | 0 | Życie Rawicza |
  5. | 1 | Życie Gostynia |
  6. | 2 | Gazeta Jarocińska |
  7. | 3 | Życie Pleszewa |
  8. | 4 | Gazeta Krotoszyńska |
  9. | 5 | Wieści Rolnicze |
  10. + ----------------- + ------------------- +

Rezultat ma wyglądać tak:
  1. Żyie Rawicza
  2. Gazeta Jarocińska
  3. Życie Pleszewa
  4. Gazeta Krotoszyńska


Trochę tego jest ... ;/

P.S
Tak ma wyglądać:
  1. http://imageshack.us/photo/my-images/27/taktb.jpg


Tak wygląda aktualnie:
  1. http://imageshack.us/photo/my-images/577/niei.jpg
redeemer
Masz zły projekt bazy danych. Zamiast trzymać w bazie w kolumnie gazety stringa ';0;3;' zrób nową tabelę gdzie będziesz miał 2 kolumny orders_current_id i newspapers_id.

Innym wyjściem "na szybko" jest żeby w tablicy funkcja selectAllNewspapers() zwracała tablicę (najlepiej z cache), gdzie kluczem byłby id gazety a wartością jego nazwa. W ten sposób w decodeN zrobisz
  1. $strN .= $selectAllNewspapersArray[ $strValue ];
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.