Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Operacje na tablicach
Forum PHP.pl > Forum > Przedszkole
d0m1n1k_
Witam,
poszukuję rozwiązania następującego problemu.
Chciałbym pobrać dane z czterech tabel w MySQL: Cena hurtowa (CH), Cena detaliczna (CD), Rabat hurtowy (RH), Rabat detaliczny (RD);
Z każdej tabeli pobierane jest: wartość, data obowiązywania.

Przykładowo:

CH: '100, 2015-01-15', '105, 2015-01-10', '100, 2015-01-01';
CD: '120, 2015-01-20', '140, 2015-01-10', '110, 2015-01-02';
RH: '0.1, 2015-01-16', '0.2, 2015-01-09';
RD: '0.05, 2015-01-18', '0.1, 2015-01-09';

Jak widać różne mogą być daty dodania i nie muszą się pokrywać i to samo tyczy się ilości wyciąganych danych.

Zastanawiam się jak mogę wstawić to do szablonu:

  1. [DATA, CH, CD, RH, RD],
  2. ['2015-01-01', 100, null, null, null],
  3. ['2015-01-02', null, 110, null, null],
  4. ['2015-01-09', null, null, 0.2, 0.1],
  5. ['2015-01-10', 105, 140, null, null],
  6. ['2015-01-15', 100, null, null, null],
  7. ['2015-01-16', null, null, 0.1, null],
  8. ['2015-01-18', null, null, null, 0.05],
  9. ['2015-01-20', null, 120, null, null]


Myślałem o array() ale nie wiem jak to dobrze złączyć poprzekształcać - słowem gleba :-//

Z góry dziękuję za pomoc.
Pyton_000
Jak wygląda tablica z BD ?
d0m1n1k_
Cztery tablice:

  1. SELECT ch_id, produkt_id, cena_hurt, ch_data FROM `ceny_hurtowe`
  2. SELECT cd_id, produkt_id, cena_detal, cd_data FROM `ceny_detaliczne`
  3. SELECT rh_id, hurtownia_id, rabat_hurt, rh_data FROM `rabaty_hurtowe`
  4. SELECT rd_id, hurtownia_id, rabat_detal, rd_data FROM `rabaty_detaliczne`


produkt_id oraz hurtownia_id są zdefiniowane więc z tym niema problemu.
Problemem jest grupowanie i połączenie do takiej formy jak opisałem.
Pyton_000
  1. <?php
  2.  
  3. $sql = "
  4. SELECT 'CH' AS `type`, ch_id, produkt_id, cena_hurt as `price`, ch_data AS 'data' FROM `ceny_hurtowe`
  5. UNION
  6. SELECT 'CD' AS `type`, cd_id, produkt_id, cena_detal as `price`, cd_data AS 'data' FROM `ceny_detaliczne`
  7. UNION
  8. SELECT 'RH' AS `type`, rh_id, hurtownia_id, rabat_hurt as `price`, rh_data AS 'data' FROM `rabaty_hurtowe`
  9. UNION
  10. SELECT 'RD' AS `type`, rd_id, hurtownia_id, rabat_detal as `price`, rd_data AS 'data' FROM `rabaty_detaliczne`
  11. ";
  12.  
  13. $data = [];
  14. foreach ($rows as $row) {
  15. $data[$row['data']][$row['type']] = $row['price'];
  16. }


Oczywiście uzupełnić o pobieranie danych tak abyś na wyjściu miał 1 tablicę.
d0m1n1k_
Ciekawe. Ale mam z tym problem.

1. Jak mam wywołać zapytanie? Tradycyjne while($q = mysql_fetch_array(mysql_query($sql))){ ... } czy może inaczej?
2. Wierszem $data = []; predefiniujesz tą tablicę czy to jakaś wskazówka dla mnie, żebym tu coś podziałał? Np. wszystkie dane jak lecą ładował do tablicy $data[]?
3. Po użyciu var_dump() otrzymałem wynik dublujących się wartości, poniżej przykład:

  1. array(6) {
  2. [0]=>
  3. string(12) "CenyHurt"
  4. ["type"]=>
  5. string(12) "CenyHurt"
  6. [1]=>
  7. string(6) "268337"
  8. ["price"]=>
  9. string(6) "268337"
  10. [2]=>
  11. string(10) "2016-01-06"
  12. ["data"]=>
  13. string(10) "2016-01-06"
  14. }


Czym to może być spowodowane?
Zapytanie poza dodaniem klauzul WHERE nie modyfikowałem. Chyba, że użyć HAVING jako określnika?
Pyton_000
użyj _assoc zamiast _array wink.gif

[] - tak, deklaracja zmiennej pustą tablicą.

pokaż kod.
d0m1n1k_
Kod - mysql bez zmian

  1. $query = mysql_query($sql);
  2. while($rows = mysql_fetch_assoc($query)){
  3. $data = []; //Tu wywala mi errora: Parse error: syntax error, unexpected '[' in C:\WebServ\httpd\lib\part_chart.php on line 17
  4. foreach ($rows as $row) {
  5. $data[$row['data']][$row['type']] = $row['price'];
  6. }
  7. }


Co do var_dump()
Dla $rows wywala ładny stos, np:
  1. array(3) {
  2. ["type"]=>
  3. string(12) "CenyHurt"
  4. ["price"]=>
  5. string(6) "268337"
  6. ["data"]=>
  7. string(10) "2016-01-06"
  8. }

Dla $row tylko daty, a dla $data pojedyncze litery i cyfry.

Rzeczywiście _assoc pomogło.
Mógłbyś jeszcze wytłumaczyć mi działanie $data[$row['data']][$row['type']] = $row['price'];
oraz jak ją wywoływać, bo to jest rzecz którą w tej chwili nie ogarniam.
Pyton_000
$data = array();

while($rows = mysql_fetch_assoc($query)){
$data[$row['data']][$row['type']] = $row['price'];
}
d0m1n1k_
Ok. Działa, ale... ... ... ... zielonego pojęcia nie mam jak mogę to wykorzystać :-///
Zależy mi na tym wzorze jak w pierwszym poście, bo chcę te dane wrzucić do wykresu - tak, tego samego który pomagałeś mi przygotować :-)))
Pyton_000
AAaaaa widzisz nie skojarzyłem tongue.gif

Dobra masz, coś takiego chyba...

  1. <?php
  2. $sql = "
  3. SELECT 'CH' AS `type`, ch_id, produkt_id, cena_hurt as `price`, ch_data AS 'data' FROM `ceny_hurtowe`
  4. UNION
  5. SELECT 'CD' AS `type`, cd_id, produkt_id, cena_detal as `price`, cd_data AS 'data' FROM `ceny_detaliczne`
  6. UNION
  7. SELECT 'RH' AS `type`, rh_id, hurtownia_id, rabat_hurt as `price`, rh_data AS 'data' FROM `rabaty_hurtowe`
  8. UNION
  9. SELECT 'RD' AS `type`, rd_id, hurtownia_id, rabat_detal as `price`, rd_data AS 'data' FROM `rabaty_detaliczne`
  10. ";
  11.  
  12. $query = mysql_query($sql);
  13. $data = array();
  14. while($rows = mysql_fetch_assoc($query)){
  15. $data[$row['data']][$row['type']] = $row['price'];
  16. }
  17.  
  18. $result = array(
  19. array('DATA', 'CH', 'CD', 'RH', 'RD')
  20. );
  21. foreach ($data as $data => $item) {
  22. $tmp = array($data);
  23. foreach($result[0] as $type) {
  24. $currItem = null;
  25. if(array_key_exists($type, $item)) {
  26. $currItem = $item[$type];
  27. }
  28. array_push($tmp, $currItem);
  29. }
  30. $result[] = $tmp;
  31. }
  32.  
  33. echo '<pre>'; var_dump($result); echo'</pre>';die(__FILE__ . ': '.__LINE__);
d0m1n1k_
Super działa.
Delikatnie go "trąciłem" żeby null był małymi literami pisany i poprawiłem $row na $rows wewnątrz while($rows = mysql_fetch_assoc($query)){},
bo wystąpił tam malutki błąd ;-)

Ale znalazłem mały problem. Wyrzuca o jedną wartość za dużo.
  1.  
  2. array(6) {
  3. [0]=>
  4. array(5) {
  5. [0]=>
  6. string(4) "DATA"
  7. [1]=>
  8. string(12) "AVG_RABAT"
  9. [2]=>
  10. string(8) "AVG_CENA"
  11. [3]=>
  12. string(8) "IND_CENA"
  13. [4]=>
  14. string(12) "IND_RABAT"
  15. }
  16. [1]=>
  17. array(6) {
  18. [0]=>
  19. string(10) "2016-01-06"
  20. [1]=>
  21. string(4) "null"
  22. [2]=>
  23. string(6) "0.150"
  24. [3]=>
  25. string(4) "8574"
  26. [4]=>
  27. string(4) "null"
  28. [5]=>
  29. string(4) "null"
  30. }
  31. [2]=>
  32. array(6) {
  33. [0]=>
  34. string(10) "2016-01-23"
  35. [1]=>
  36. string(4) "null"
  37. [2]=>
  38. string(6) "0.175"
  39. [3]=>
  40. string(4) "9740"
  41. [4]=>
  42. string(4) "null"
  43. [5]=>
  44. string(4) "null"
  45. }
  46. [3]=>
  47. array(6) {
  48. [0]=>
  49. string(10) "2015-11-13"
  50. [1]=>
  51. string(4) "null"
  52. [2]=>
  53. string(4) "null"
  54. [3]=>
  55. string(4) "null"
  56. [4]=>
  57. string(5) "11900"
  58. [5]=>
  59. string(6) "0.100"
  60. }
  61. [4]=>
  62. array(6) {
  63. [0]=>
  64. string(10) "2015-11-15"
  65. [1]=>
  66. string(4) "null"
  67. [2]=>
  68. string(4) "null"
  69. [3]=>
  70. string(4) "null"
  71. [4]=>
  72. string(5) "10900"
  73. [5]=>
  74. string(4) "null"
  75. }
  76. [5]=>
  77. array(6) {
  78. [0]=>
  79. string(10) "2016-01-19"
  80. [1]=>
  81. string(4) "null"
  82. [2]=>
  83. string(4) "null"
  84. [3]=>
  85. string(4) "null"
  86. [4]=>
  87. string(4) "null"
  88. [5]=>
  89. string(6) "0.125"
  90. }
  91. }


Pyton_00 => Mega Giga browar dla Ciebie za to jak pomagasz!
Dzięki wielkie, ale błagam, jeśli masz tylko chęć, jeszcze odrobinę pomóż ;-)!

Na marginesie - teraz działa bardzo ładnie.
Omijam jeden element w wyświetlaniu i już
Pyton_000
wywal $data z $tmp = array($data);
i w zapytaniach 'data' zmień na 'DATA'
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.