Toon posts:

[php] Array verwerken

Pagina: 1
Acties:

Onderwerpen


  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 24-03 20:55

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!

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 24-02 10:54
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.

  • 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);

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 06:54
Qua tip voor eigen beheer: highcharts.

  • thioz
  • Registratie: September 2001
  • Laatst online: 06-11-2018
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.

I feel like i've been taking crazy pills



Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee