webForumDet fria alternativet

Bästa loopgrejen

PHP

11 svar · 372 visningar · startad av nkrantz

Medlem sedan apr. 2002830 inlägg
Frågan#1

Hello...

Sitter här å håller på med en grej å kom å tänka på hur man bör konstruera looparna när man loopar igenom resultatet från en db query..

normalt använder jag:

for ($i=0; $i<mysql_num_rows($rSet); $i++)

eller:

while ($data = mysql_fetch_object($rSet))

lite beroende på om jag vill ha resultatet i en array eller ej...

men jag kom ju å tänka på att följande funkade också:

for ($i=0; $data = mysql_fetch_object($rSet); $i++)

å om man använder den här sistnämnda så behöver man ju inte ha

$data = mysql_fetch_object($rSet);

efter den loopen som man behöver i det översta exemplet...

Så nu undrar jag, lite trött efter att buggcheckat en hel dag, vad som är smartast å mest effektivt att använda...

// Nippe

Medlem sedan mars 2002777 inlägg
Medlem sedan apr. 2002830 inlägg
#3

njea... det var inte riktigt det jag eftersökte som svar... men det är en mycket bra tråd!

Medlem sedan mars 2002777 inlägg
#4

Normalt sätt brukar for-slingor förespråkas framför andra metoder att loopa ut data. Hur det är i ditt fall vet i sören, för jag är inte tillräckligt hemma än i vad de olika metoderna returnerar.

Medlem sedan juni 20014 290 inlägg
#5

while() är väl mera logiskt/lättläst än att göra det i en for loop.

Normalt används en for loop när man vill räkna upp/ner någonting, medans en while() loop körs så länge uttrycket är sant.

Vilket man använder är en smak sak, men i detta fallet skulle jag använda while() eftersom det är mera logiskt och lättläst. :)

Medlem sedan apr. 2002830 inlägg
#6

jo... men om vi säger att jag vill använda mig av upp/ner räkning... vad är bäst att ha som villkor för hur länge for loopen skall fortsätta...

for ($i=0; $i<mysql_num_rows($rSet); $i++)

eller

for ($i=0; $data=mysql_fetch_object($rSet); $i++)

?

Jag ger mig inte ;)
/Nippe

Medlem sedan maj 20001 953 inlägg
#7

mysql_num_rows skall du iaf inte sätta i for parentesen. Det räknar du ut innan (för som jag förstår står detta värde sig genom alla körningar).

Det rör sig om flera 100 % i körtider.

Jag har inte tittat närmare på det rent prestandamässigt. Men kör du *nix finns ett program som heter ApacheBench (eller nått liknande, tror inte det finns i win-versionen) som följer med Apache. I Apache's bin heter det binären ab.

Där kan du själv testa vad som går bäst. Men var är det för fel på:

<?PHP

...
...

$result = mysql_query(..); 

whíle ($row = mysql_fetch_array($result)) {
    ...
    ...
}

...
...

?>
Medlem sedan apr. 2002830 inlägg
#8

varför inte sätta mysql_num_rows i for loopen? Det kontrollerar ju bara hur många rader som queryn ger tillbaka... Borde ju inte vara någon större prestandavinst att spara det till en variabel innan forloopen... while loopen kör jag i vanliga fall, jag satt bara å experimenterade lite å kom å tänka på det olika varianterna och tyckte att det vore bäst att kolla med profsen!

Medlem sedan feb. 20002 300 inlägg
#9

Några flera 100% rör det sig inte om.

Det är klart att man får en lite prestandavinst om man tilldelar en variabel med mysql_num_rows() och sen använder den variabeln som jämförelse istället. Men skillnaden är nog marginell.

Medlem sedan maj 20001 953 inlägg
#10

Jag vet inte exakt med mysql_num_rows, men en count i for gör flera hundra procent!

Nu märker man kanske det inte ändå, eftersom det är så korta körtider, men procentuellt sett är det så.

Medlem sedan mars 20007 896 inlägg
#11

Använder du for-loopen får du en massa ( Nåja, två ;) ) skräp-variabler, vilket jag inte tycker om - och eftersom att for-loopar också är de mest komplexa looparna så är den troligtvis söligare. Använd while().

Medlem sedan apr. 2002830 inlägg
#12

ni är bra ni! ;)

278 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
146 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)