[php] Array verwerken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 20-09 20:54

Douweegbertje

Wat kinderachtig.. godverdomme

Topicstarter
Beste tweakers,

Ik ben sinds kort bezig met het verwerken van data naar charts. Denk hierbij gewoon aan je standaard lijn, staaf en pie charts.
Hiervoor gebruik ik de google chars api: https://developers.google.com/chart/
Naar mijn gevoel is dit gewoon wel een stabiel platform, al heb ik liever de code (voor de charts) in eigen beheer. Enige tips zijn altijd hier welkom voor.

Maar dat is mijn vraag niet.

Ik zit met het punt: Hoe verwerk ik mijn data op de juiste manier om hiervan correcte charts te maken.
De query is vrij groot, en bevat tot nu toe 2 joins waarvan er waarschijnlijk nog 1 bij komt.
Uit mijn oogpunt zou ik het liefst 1 query oproepen om vervolgens meerdere 'data sets' hiervan te maken, in plaats van dat ik per chart een specifieke query ga aanroepen waarmee ik dus de server mee ga belasten.

Om een fictief voorbeeld te geven zou mijn array er zo uit zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[0] =>

- klantnummer
- ordernummer
- productnummer
- datum-inruil
- bedrag-aankoop
- type product
- product categorie

[1] =>

- klantnummer
- ordernummer
- productnummer
- datum-inruil
- kosten-inruil
- type product
- product categorie


Om even verder te gaan, komt bovenstaande array uit de query die je in feite zou kunt beschrijven:

code:
1
2
3
4
5
//negeer de foutheid, het is puur in 'spreekvorm'
Select 'bovenstaandewaardes FROM inruilproducten 
JOIN klanten on klantnummer
JOIN producten on productnummer
WHERE klantnummer = $uit-een-var-van-huidige-klant


Dus dit zijn - alle - inruilproducten van 1 klant.

Mijn "probleem" zit hem in het volgende:

- Een klant heeft meerdere producten
- Een klant kan per product meerdere ruilingen hebben gedaan

Van de data uit de array zou ik de volgende charts willen maken:

- Overzicht van alle ruilingen in een lijn chart gebaseerd op datum
- Overzicht per product hoeveel hij geruild wordt.
- Overzicht van de kosten van de inruil per ruil actie (dit kan variëren, fictief voorbeeld)
- Overzicht van de kosten per product categorie.

Mijn punt zit hem in het feit dat ik de array moet verwerken op allerlei gebieden.
Zo dien je in feite de gehele array door te lopen en te kijken of het huidige productnummer al voorbij gekomen is in de array (dit betekend dus 2+ ruilacties).

Op de 1 of andere manier (nu ik al een beetje ben begonnen) krijg ik het gevoel dat ik enorm ineffecient bezig ben. Niet dat 10 query's op de DB beter zouden zijn, maar om de array nou 2x te laten loopen (multiarray) en bij elk ditje en datje if statements te maken om zo nieuwe arrays te maken. Waarbij je vervolgens deze weer moet loopen voor eventuele sorts en de data opmaak naar je chart api / js /whatever je gebruikt.


Heeft iemand dit ooit eens gedaan, om van eigenlijk 1 dataset meerdere charts / outputs te maken, en dan wel zo efficiënt mogelijk?
Heeft iemand tips/tricks, ideeën of wat dan ook?

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 10-09 08:19
Je zou toch gewoon de array kunnen loopen en er vervolgens direct arrays mee kunnen vullen of indeien nogig bij te werken. Ik kan me niet helemaal goed er in verplaatsen, maar het verwerken van een array is vaak goed te doen in een zwik.
Een mooi voorbeeld hiervan (in een compleet andere context) is het volgende denk ik:
http://wizardinternetsolu...dynamic-multi-level-menu/

Hier wordt ook een resultaten array omgezet in een compleet andere datastructuur, zonder deze zeer vaak te loopen, in principe zijn dit soort oplossingen volgensmij de makkelijkst en de meest overzichtelijkste.

Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

Wat charts betreft gebruik ik zelf Flot, wat een plot library is voor jQuery. De data kun je in json aanleveren. Mbv json_encode kun je php arrays direct omzetten.

Ik zie het probleem niet helemaal met het moeten loopen. Gebaseerd op de complexiteit of diversiteit van je weergave zul je één of meerdere queries moeten uitvoeren. Probeer niet alles kost wat kost in één complexe query te proppen. Soms zijn twee queries dan handiger. Overigens zegt de grootte van de query niets over de omvang van het resultaat. Premature optimization is the root of all evil ;)

Je kunt denk ik het best simpel beginnen en dit langzaam uitbouwen naar een complexere view. Of het efficiënter is om sql het werk te laten doen of php kom je alleen achter door het te testen. Dat hangt mede af van je databaseontwerp. Wat je zou kunnen doen is alle benodigde records ophalen, sql handig laten (voor)sorteren en de data per chart verwerken en in een aparte array stoppen. Een tiental keer loopen over de dataset ligt php echt niet wakker van. Hoe zijn de ruilingen gerelateerd aan elkaar? Dat is me nog niet helemaal duidelijk.

Om even een heel simpel voorbeeld te geven:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// haal data op
$result = $query->execute();

// verwerk $result tot de juiste data per chart
$data = array();
$data[1] = getDataChart1($result);
$data[2] = getDataChart2($result);

$view->data = $data;

// in je view (met Flot)
echo json_encode($this->data);

Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Nu online

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Qua tip voor eigen beheer: highcharts.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik ben het met We Are Borg eens ... Highcharts is een erg mooie oplossing die je naar hartenlust kunt tweaken / customizen.

Verder om in te haken op het antwoord van Bee ... Een paar simpele joins zal een database server niet echt wakker van liggen, zolang je niet gigantische datasets ophaalt waarvan je maar een fractie nodig hebt natuurlijk, dat is gewoon zonde.

Verder zou ik sowieso er voor kiezen om het ophalen / opbouwen van de data in een DAL/DAO/Model of iets dergelijks plaats te laten vinden zodat je deze makkelijk kunt herbruiken en eventueel te gebruiken is in combinatie met caching.