Toon posts:

[PHP+MySQL] Sneller manier om array tot stand te brengen

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik zal me de moeite besparen om uit te leggen dat ik m'n hoofd hier al maanden over heb gebroken en zelfs in 2 hoog aangeschreven PHP boeken urenlang heb gezocht, want dat is gewoon zo...

dit heb ik nu:

PHP:
1
2
3
4
5
6
7
$query = "SELECT date FROM dates WHERE accom_id = '$accom_id'";
$dates = mysql_query($query);

$reserved_dates = array();
while($returned_date = mysql_fetch_row($dates)) {
    array_push($reserved_dates, $returned_date[0]);
}


Zoals je ziet haal ik uit MySQL maar 1 kolom op. Deze wordt echter in een array gestopt, die ik eerst weer moet loepen om ze uit te lezen. Dit resulteerde in een runtime van 0,5 sec... Nu doe ik het op deze manier en loop vervolgens alleen de array 'reserved_dates' en heb nu maar een runtime van 0,1 sec. Een behoorlijke snelheidswinst dus... Alleen de syntax is niet bepaald cool.

Is er een mogelijkheid om de array 'reserved_dates' direct vanuit de mysql_fetch_row o.i.d. al tot stand te brengen?

  • Sn3akz
  • Registratie: November 2000
  • Laatst online: 31-01 20:37
Je zal hem hoe dan ook van de ene in de ander array moeten overhevelen... Misschien handige om mysql_fetch_array te gebruiken icm met een for..each statement.. maar verder zal je hoe dan ook over moeten pompen

Verwijderd

Topicstarter
Ik zal even nader proberen toe te lichten...

Ik heb een functie genaamd 'isFree'. Deze checked voor mij of een bepaalde datum al gereserveerd is (dus in de database is opgenomen) of nog niet. Deze functie wordt gemiddeld 90 keer per parse aangeroepen.

In eerste instantie had ik dit op onderstaande wijze gedaan, wat resulteerde in een load time van 0,5 sec:

PHP:
1
2
3
4
5
6
7
8
9
function isFree($YearToShow,$MonthToShow,$i) {

   $query = "SELECT date FROM dates WHERE accom_id = '$accom_id'";
   $dates = mysql_query($query);

   while($returned_date = mysql_fetch_row($dates)) {
      /////// HIER HEB IK HET GEWENSTE RESULTAAT IN '$returned_date[0]'
   }
}


En nu heb ik dit teruggebracht naar een load time van 0,1 sec. op de volgende wijze, door slechts 1 keer de MYSQL database aan te roepen i.p.v. de ongeveer 90 keer in bovenstaand voorbeeld:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$query = "SELECT date FROM dates WHERE accom_id = '$accom_id'";
$dates = mysql_query($query);

$reserved_dates = array();
while($returned_date = mysql_fetch_row($dates)) {
   array_push($reserved_dates, $returned_date[0]);
}

function IsFree($YearToShow,$MonthToShow,$i) {
   global $reserved_dates;

   foreach ($reserved_dates as $date) {
      /////// HIER HEB IK HET GEWENSTE RESULTAAT IN '$date'
   }
}


Mijn probleem is dus dat het me nogal omslachtig lijkt om van één enkele gereturneerde kolom een multidimensionale array te maken om daar vervolgens middels een loop een enkele array van te maken... Ik wil dus gewoon in 1 keer de array 'reserved_dates' tot stand brengen.

  • sebas
  • Registratie: April 2000
  • Laatst online: 16-12-2025
Ik begrijp dat je de commands binnen de loop zo licht mogelijk wilt maken. Je zou kunnen proberen om in je resultaat wat makkelijker opvraagbaar te maken, bijvoorbeeld niet door middel van een functie, maar door de array met gereserveerde data direct te aan te spreken; dat kun je ongeveer als volgt implementeren.

Dit kan ongeveer als volgt eruitzien:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$query = "SELECT date FROM dates WHERE accom_id = '$accom_id'";
$dates = mysql_query($query);

$reserved_dates = array();
while($returned_date = mysql_fetch_row($dates)) {
    $reserved_date[returned_date[0]] = '1'; // true   
} 

function IsFree($date) {
    global $reserved_dates;
    return $reserved_dates[$date];
}
?> 


Ik weet niet precies of dit is wat je bedoelt, maar het lijkt me efficienter dan wat erboven staat.

[ Voor 7% gewijzigd door sebas op 23-04-2003 23:48 ]

Everyone complains of his memory, no one of his judgement.


  • Sn3akz
  • Registratie: November 2000
  • Laatst online: 31-01 20:37
Verwijderd schreef op 23 April 2003 @ 22:29:
Mijn probleem is dus dat het me nogal omslachtig lijkt om van één enkele gereturneerde kolom een multidimensionale array te maken om daar vervolgens middels een loop een enkele array van te maken... Ik wil dus gewoon in 1 keer de array 'reserved_dates' tot stand brengen.
Dat doe je toch?? Met een loopje.. zoals ik al zei: Zit weinig anders op. Je zal toch die mysql array moeten fetchen.. rij voor rij... Dit is al een stuk verbeterd natuurlijk... 90 keer een SQL query uitvoeren.. pfoeh!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:14

Bosmonster

*zucht*

Er zit nog een groot verschil tussen wat jij doet en wat sebas doet :)

sebas loopt niet elke functie-aanroep door de array heen, maar retourneert gewoon 1 waarde uit de array. Aangezien je isFree() methode waarschijnlijk een boolean waarde terugverwacht (aan de functienaam te zien) is dit verreweg het efficientste.

Het ophalen van records gaat per record, welke je ook altijd per record aan een array zult moeten toevoegen. Je krijgt nu eenmaal geen volledige array terug (alleen array voor de kolommen).

[ Voor 24% gewijzigd door Bosmonster op 24-04-2003 09:40 ]


Verwijderd

Topicstarter
Sebas, helemaal te gek! Bedankt!

Om de code wat overzichtelijker te houden heb ik de functie helemaal onderaan het script geplaatst. Om geen scheiding te krijgen tussen de MySQL query en de daadwerkelijke funtie heb ik het uiteindelijk als volgt in elkaar gezet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# - IsRes ------------------------------------------------------------
#
#   De functie IsRes (Is Reservated) checkt of een genoemde datum
#   reeds is gereserveerd, ofwel in de database is opgenomen.
#
# - IsRes ------------------------------------------------------------

function IsRes($YearToShow,$MonthToShow,$i) {
    global $reserved_dates;

    if (! IsSet($reserved_dates)) {
        $query = "SELECT date FROM dates WHERE accom_id = '1'";
        $dates = mysql_query($query);

        $reserved_dates = array();
        while($returned_date = mysql_fetch_row($dates)) {
            $reserved_dates[$returned_date[0]] = 1; // true
        }
    }

    $reserved_date = date("Y-m-d",mktime(0,0,0,$MonthToShow,$i,$YearToShow));
    return $reserved_dates[$reserved_date];
}

# ---------------------------------------------------------------------
Blijkens uiterst succesvol met een load time van 0,1 sec!!! (vanaf een externe pc zelfs maar 0,02 sec!!!)

[ Voor 62% gewijzigd door Verwijderd op 25-04-2003 21:17 ]

Pagina: 1