Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] wyświetlenie wyników zapytania w postaci macierzy
Forum PHP.pl > Forum > PHP
john_doe
Hej,
wynik zapytania daje mi takie dane
wyrob | nr tygodnia | ilosc
--------------------------------
WG_01 | 25 | 1111
WG_02 | 25 | 1112
WG_03 | 25 | 1113
WG_01 | 26 | 1114
WG_02 | 26 | 1115
WG_03 | 27 | 1116
etc....
chciałbym to wyświetlić w postaci macierzy tzn. numery tygodni w wierszach, nazwy wyrobów w kolumnach a wartości w środku
Jak to zrobić?
Wyświetlam sobie z innego zapytania w kolumnach wyroby. Wyświetlam sobie w pętli numery tygodni. Jednak mam problem jak teraz posłużyć się tablicą ( tą powyżej ), aby powpisywać w odpowiednie miejsca ilości....

jak dotąd udaję mi się wyświetlić w taki sposób:

  1. <table border="1px">
  2. <tr>
  3. <td>blank</td>
  4. <? foreach($premixy as $row): ?>
  5.  
  6. <td><?= $row->PRX_Nazwa; ?></td>
  7.  
  8. <? endforeach; ?>
  9. </tr>
  10. <? for( $i=25 ; $i<=46; $i++): ?> <!-- tutaj też nie chcę w taki sposób iterować po tygodniach -->
  11. <? foreach($result as $detail): ?>
  12. <? if( $detail->WD_NrTygodnia == $i ): ?>
  13. <tr>
  14. <td><?= $detail->WD_NrTygodnia; ?></td>
  15. <td><? if($detail->PRX_Nazwa == 'WG_1') echo $detail->Spozycie; ?></td>
  16. <td><? if($detail->PRX_Nazwa == 'WG_2') echo $detail->Spozycie; ?></td>
  17. <td><? if($detail->PRX_Nazwa == 'WG_3') echo $detail->Spozycie; ?></td>
  18. </tr>
  19. <? endif; ?>
  20. <? endforeach; ?>
  21. <? endfor; ?>

jednak nie daje mi to rezultatu w postaci jednego wiersza per dany tydzień

tablica obiektów jest takiej postaci

  1. array (size=41)
  2. 0 =>
  3. array (size=4)
  4. 'PRX_Id' => string '1' (length=1)
  5. 'PRX_Nazwa' => string 'WG_1' (length=13)
  6. 'WD_NrTygodnia' => string '25' (length=2)
  7. 'Spozycie' => string '24.9149988591671' (length=16)
  8. 1 =>
  9. array (size=4)
  10. 'PRX_Id' => string '3' (length=1)
  11. 'PRX_Nazwa' => string 'WG_3' (length=14)
  12. 'WD_NrTygodnia' => string '25' (length=2)
  13. 'Spozycie' => string '239.92499738931656' (length=18)
  14. 2 =>
  15. array (size=4)
  16. 'PRX_Id' => string '1' (length=1)
  17. 'PRX_Nazwa' => string 'WG_1' (length=13)
  18. 'WD_NrTygodnia' => string '26' (length=2)
  19. 'Spozycie' => string '72.36499756574631' (length=17)
  20. 3 =>
  21. array (size=4)
  22. 'PRX_Id' => string '2' (length=1)
  23. 'PRX_Nazwa' => string 'WG_2' (length=12)
  24. 'WD_NrTygodnia' => string '26' (length=2)
  25. 'Spozycie' => string '35.96999913454056' (length=17)
  26. 4 =>
  27. array (size=4)
  28. 'PRX_Id' => string '3' (length=1)
  29. 'PRX_Nazwa' => string 'WG_3' (length=14)
  30. 'WD_NrTygodnia' => string '26' (length=2)
  31. 'Spozycie' => string '559.8249939084053' (length=17)
  32. 5 =>
  33. array (size=4)
  34. 'PRX_Id' => string '1' (length=1)
  35. 'PRX_Nazwa' => string 'WG_1' (length=13)
  36. 'WD_NrTygodnia' => string '27' (length=2)
  37. 'Spozycie' => string '60.812498070299625' (length=18)
aachi
Hej.
Posortuj dane po tygodniu. Na przykład:
  1. <?php
  2. foreach ($premixy as $row) {
  3. //Jeśli jesteś pewien, że nie ma dwóch obiektów z tą samą nazwą i tygodniem to możesz pniższą linie pominąć
  4. if (isset($posortowanepremixy[$row->WD_NrTygodnia][$row->PRX_Nazwa])) echo 'Uch... Obiekt o danej nazwie w danym tygodniu się powtarza!';
  5.  
  6. $posortowanepremixy[$row->WD_NrTygodnia][$row->PRX_Nazwa]=$row; //indeksujemy tablice tygodniami i nazwami
  7. $nazwypremixow[$row->PRX_Nazwa]=1; //Zapisujemy też listę wszystkich nazw kolumn (nie wiem czy znasz wszystkie... jeśli tak to możesz tą linie pominąć)
  8. }
  9. if (false===ksort($posortowanepremixy,SORT_NUMERIC)) echo 'Uch sortowanie coś się walnęło!'; //sortujemy od najmniejszego do największego po tygodniach
  10. ?>
  11. <table class="borders">
  12. <tr><th></th> <!-- Pierwsza komórka pusta -->
  13. <?php
  14. //Najpierw wypisujemy wszystkie kolumny (Jeśli je znasz to zamiast poniższej pętli możesz je ręcznie wpisać np. <th>WG_01</th><th>WG_02</th> .....
  15. foreach ($nazwypremixow as $nazwa=>$zbedne) echo '<th>'.$nazwa.'</th>';
  16. echo '</tr>';
  17.  
  18. //I teraz wypisujesz wszystkie wiersze tygodniami
  19. foreach ($posortowanepremixy as $tydzien=>$wszystkieobiektyztygodnia) {
  20. echo '<tr><th>'.$tydzien.'</th>';
  21. foreach ($nazwypremixow as $nazwa=>$zbedne) {
  22. echo '<td>';
  23. if (isset($wszystkieobiektyztygodnia[$nazwa])) echo $wszystkieobiektyztygodnia[$nazwa]->Spozycie;
  24. echo '</td>';
  25. }
  26. echo '</tr>';
  27. }
  28. ?>
  29. </table>


No i w bloku <head> strony dajesz gdzieś:
  1. <style type="text/css">
  2. table.borders, table.borders th, table.borders td { border: 1px solid #000; }


Pisane z głowy, więc pewnie jakaś literówka gdzieś się wkradła.
john_doe
nie śmiga ale Twoją ideę zrozumiałem. Dzięki za duży haczyk smile.gif

jest jeszcze jeden mały problem. Kod wypisuje wszystko po kolei jak leci, tzn. jeśli w danym tygodniu nie występuje jakiś wyrób macierz jest błędna, przesunięte wartości nie w tej kolumnie co trzeba.
aachi
No tak kopiuj wklej nie działało, bo myślałem, że masz tablice obiektów, a nie tablice tablic. Niedopatrzenie, ale powinieneś to sam wychwicić i poprawić.

Teraz działa - odpaliłem i sprawdziłem.
  1. <!DOCTYPE html>
  2. <style type="text/css">
  3. table.borders, table.borders th, table.borders td { border: 1px solid #000; }
  4. </head>
  5. <?php
  6. //Tworzę losowe dane; ify są by czasami nie było jakiegoś produktu w danym tygodniu
  7. for ($a=1,$b=1;$a<20;$a++) {
  8. if ($a%5<>2) $premixy[]= array('PRX_Id'=>$b++,'PRX_Nazwa'=>'WG_1', 'WD_NrTygodnia'=>$a, 'Spozycie'=>$a.' '.rand());
  9. if ($a%5<>3) $premixy[]= array('PRX_Id'=>$b++,'PRX_Nazwa'=>'WG_2', 'WD_NrTygodnia'=>$a, 'Spozycie'=>$a.' '.rand());
  10. $premixy[]= array('PRX_Id'=>$b++,'PRX_Nazwa'=>'WG_3', 'WD_NrTygodnia'=>$a, 'Spozycie'=>$a.' '.rand());
  11. }
  12.  
  13. foreach ($premixy as $row) {
  14. //Jeśli jesteś pewien, że nie ma dwóch obiektów z tą samą nazwą i tygodniem to możesz pniższą linie pominąć
  15. if (isset($posortowanepremixy[$row['WD_NrTygodnia']][$row['PRX_Nazwa']])) echo 'Uch... Obiekt o danej nazwie w danym tygodniu się powtarza!';
  16. $posortowanepremixy[$row['WD_NrTygodnia']][$row['PRX_Nazwa']]=$row; //indeksujemy tablice tygodniami i nazwami
  17. $nazwypremixow[$row['PRX_Nazwa']]=1; //Zapisujemy też listę wszystkich nazw kolumn (nie wiem czy znasz wszystkie... jeśli tak to możesz tą linie pominąć)
  18. }
  19. if (false===ksort($posortowanepremixy,SORT_NUMERIC)) echo 'Uch sortowanie coś się walnęło!'; //sortujemy od najmniejszego do największego po tygodniach
  20.  
  21. ?>
  22. <table class="borders">
  23. <tr><th></th> <!-- Pierwsza komórka pusta -->
  24. <?php
  25. //Najpierw wypisujemy wszystkie kolumny (Jeśli je znasz to zamiast poniższej pętli możesz je ręcznie wpisać np. <th>WG_01</th><th>WG_02</th> .....
  26. foreach ($nazwypremixow as $nazwa=>$zbedne) echo '<th>'.$nazwa.'</th>';
  27. echo '</tr>';
  28.  
  29. //I teraz wypisujesz wszystkie wiersze tygodniami
  30. foreach ($posortowanepremixy as $tydzien=>$wszystkieobiektyztygodnia) {
  31. echo '<tr><th>'.$tydzien.'</th>';
  32. foreach ($nazwypremixow as $nazwa=>$zbedne) {
  33. echo '<td>';
  34. if (isset($wszystkieobiektyztygodnia[$nazwa])) echo $wszystkieobiektyztygodnia[$nazwa]['Spozycie'];
  35. echo '</td>';
  36. }
  37. echo '</tr>';
  38. }
  39. ?>
  40. </table>
  41. <hr>
  42. <?php
  43. echo '<pre>'.print_r($premixy,true).'</pre>';
  44. ?>


Swoją drogą jeśli dane pobierasz z bazy, to z niej możesz już brać posortowane tygodniami... No i indeksować odrazu w momencie pobierania. Zawsze to jedna pętla mniej.
john_doe
dokładnie tak zrobiłem, sortuję na poziomie bazy. Mam tablicę obiektów smile.gif
Wszystko ładnie działa, DZIĘKI WIELKIE za Twój czas!
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.