webForumDet fria alternativet

Bästa loopgrejen

11 svar · 372 visningar · startad av nkrantz

nkrantzMedlem sedan apr. 2002755 inlägg
#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

LAMPMedlem sedan mars 2002729 inlägg
nkrantzMedlem sedan apr. 2002755 inlägg
#3

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

LAMPMedlem sedan mars 2002729 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.

GunnarDMedlem sedan juni 20014 250 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. :)

nkrantzMedlem sedan apr. 2002755 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

ChavezMedlem sedan maj 20001 297 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)) {
    ...
    ...
}

...
...

?>
nkrantzMedlem sedan apr. 2002755 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!

PhorpherMedlem sedan feb. 20002 059 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.

ChavezMedlem sedan maj 20001 297 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å.

SPiNMedlem sedan mars 20005 832 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().

nkrantzMedlem sedan apr. 2002755 inlägg
#12

ni är bra ni! ;)

Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb