Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Uzupełnienie luk tablicy
markonix
post 26.12.2010, 22:55:09
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Ciężko mi nazwać temat bo nie mam pojęcia jak to nazwać, a ogólnie problem prosty.

Dane z bazy wyciągnięte dzięki GROUP BY i funkcji date ORAZ SUM

type date SUM
xxx 2008-03-27 1
xxx 2008-03-30 6
xxx 2008-04-04 1
xxx 2008-04-05 2
xxx 2008-04-06 8
xxx 2008-04-07 2
xxx 2008-04-08 3
xxx 2008-04-09 2

(xxx to jakiś typ usługi, data zamówienia i suma w danym dniu).
Dane pobieram do wykresu, który przyjmuje wartości w formie json co jest mniej istotne.
Istotne mianowicie jest, że podaje je po przecinku, a wykres sam podstawia pod daty i prowadzi to do błędu w przypadku przerw.

Chciałbym dostać tablice, z wszystkimi indeksami wraz z lukami z wartością ZERO.
type date SUM
xxx 2008-03-27 1
xxx 2008-03-28 0
xxx 2008-03-29 0

xxx 2008-03-30 6
itd.

Wykres przyjmuje wartości w postaci 1, 0, 0, 6 i można się domyśleć, że brak zer spowoduje przesunięcie.

Może to się da zrobić na poziomie samego zapytania (mysql), jeśli nie to jak to zrobić po stronie php?
Oczywiście mogę puścić pętle iterującą po kolejnych dniach ale to wygeneruje kilkaset zapytań (tyle ile dni) do bazy - raczej mało optymalne.
Poza tym tych typów jest kilka i ostatecznie chciałbym otrzymać kilka tablic - oddzielnie dla każdego.

Ten post edytował markonix 26.12.2010, 22:56:09


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
tehaha
post 27.12.2010, 00:06:22
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


można to zrobić jednym zapytaniem

1. Pobierasz te dane i wrzucasz do tablicy, gdzie klucz to będzie data, a wartość to co masz czyli:

['2008-03-27'] => xxx 2008-03-27 1
['2008-03-30'] => xxx 2008-03-30 6
['2008-04-04'] => xxx 2008-04-04 1

2. następnie używając modyfikacji tej funkcji http://prajapatinilesh.wordpress.com/2009/...using-php-code/

wygenerujesz tablicę z kluczami do wszystkich data z przedziału i wartościami 0

3. używając funkcji http://php.net/manual/en/function.array-merge.php, połączysz obie tablice, w ten sposób te daty, które posiadają wartości nadpiszą te z zerami czyli ['2008-03-27'] => 0 zostanie zastąpione przez ['2008-03-27'] => xxx 2008-03-27 1, dla pozostałych zostanie 0

w ten sposób otrzymasz tablicę z datami z przedziału od/do , z brakującymi wartościami jako 0

tutaj masz modyfikację:

  1. <?php
  2. $fromDate = '2010-01-14';
  3. $toDate = '2010-04-14';
  4.  
  5. $dateMonthYearArr = array();
  6. $fromDateTS = strtotime($fromDate);
  7. $toDateTS = strtotime($toDate);
  8.  
  9. for ($currentDateTS = $fromDateTS; $currentDateTS <= $toDateTS; $currentDateTS += (60 * 60 * 24))
  10. {
  11. // use date() and $currentDateTS to format the dates in between
  12. $dateMonthYearArr[date("Y-m-d",$currentDateTS)] = 0;
  13. //print $currentDateStr.”<br />”;
  14. }
  15.  
  16. echo "<pre>";
  17. print_r($dateMonthYearArr);
  18. echo "</pre>";
  19. ?>
Go to the top of the page
+Quote Post
markonix
post 27.12.2010, 00:55:55
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Dziękuje, zaraz spróbuje.

Tymczasem wpadłem na podobny pomysł ale po stronie mysql.
Stworzyć bazę o strukturze analogicznej do tablicy z pętli Twojego skryptu (data i zero), a następnie też łączenie tylko w przypadku baz chodzi oczywiście o JOIN.



--------------------
Go to the top of the page
+Quote Post
tehaha
post 27.12.2010, 01:08:39
Post #4





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


na tablicy będzie wydajniej, nie ma sensu obciążać bazy danych do takich operacji, zwłaszcza, że możesz sobie to ładnie opakować w funkcje i wywoływać jedną linijką kodu
Go to the top of the page
+Quote Post
markonix
post 27.12.2010, 01:37:38
Post #5





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Miałem pewne opory ze względu na to, że tablica ma pewne ograniczenia pamięciowe i kiedyś skrypt mi się wysypał stąd uraz smile.gif

Twoje porady się sprawdziły choć array_merge nie do końca spełniło oczekiwania co do drugiego indeksu - typu usługi.
Ładowało zerami tylko gdy nie było żadnej usługi, żadnego typu. Gdy choć jedna była w danym dniu to już omijał i zostawiał jak było.
Ale byłem pewien, że ktoś chciał osiągnąć taki efekt jak ja i wypróbowałem wszystkie funkcje na php.net
Gdzieś za 5tym razem trafiłem:

  1. function array_overlay($a1,$a2)
  2. {
  3. foreach($a1 as $k => $v) {
  4. if(!array_key_exists($k,$a2)) continue;
  5. if(is_array($v) && is_array($a2[$k])){
  6. $a1[$k] = array_overlay($v,$a2[$k]);
  7. }else{
  8. $a1[$k] = $a2[$k];
  9. }
  10. }
  11. return $a1;
  12. }


Dzięki za pomoc.

Ten post edytował markonix 27.12.2010, 01:39:36


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:10