Avatar billede flodhesten Nybegynder
31. december 2007 - 00:37 Der er 23 kommentarer og
1 løsning

Reducere koder

Hej eksperter...

Hvordan kan man reducere:

if ($attackamount['0'] > $row['s1'] ) { header('Location: attack.php'); exit; }
if ($attackamount['1'] > $row['s2'] ) { header('Location: attack.php'); exit; }
if ($attackamount['2'] > $row['s3'] ) { header('Location: attack.php'); exit; }
if ($attackamount['3'] > $row['s4'] ) { header('Location: attack.php'); exit; }
if ($attackamount['4'] > $row['s5'] ) { header('Location: attack.php'); exit; }
if ($attackamount['5'] > $row['s6'] ) { header('Location: attack.php'); exit; }
if ($attackamount['6'] > $row['s7'] ) { header('Location: attack.php'); exit; }
if ($attackamount['7'] > $row['s8'] ) { header('Location: attack.php'); exit; }

sådan at det bliver en kortere kode? Noget med løkker gætter jeg på, men jeg kan ikke helt hitte ud af det.

Jeg har desuden også enn kode som:

$defenceamount = array($row['s1'],$row['s2'],$row['s3'],$row['s4'],$row['s5'],$row['s6'],$row['s7'],$row['s8']);

Kan den gøres kortere?

Eller hvad nu med:

$query = mysql_query("UPDATE users SET
s1=s1-".($attackamount['0']-$aa['0']).",
s2=s2-".($attackamount['1']-$aa['1']).",
s3=s3-".($attackamount['2']-$aa['2']).",
s4=s4-".($attackamount['3']-$aa['3']).",
s5=s5-".($attackamount['4']-$aa['4']).",
s6=s6-".($attackamount['5']-$aa['5']).",
s7=s7-".($attackamount['6']-$aa['6']).",
s8=s8-".($attackamount['7']-$aa['7'])."
WHERE username='" . $_SESSION['user'] . "'") or die(mysql_error());


På forhånd tak.
Avatar billede xica Nybegynder
31. december 2007 - 00:45 #1
for($i = 0; $i <= 7; $i++) {
if ($attackamount['$i'] > $row['s$i'] ) { header('Location: attack.php'); exit; }
}

Jeg er ikke sikker, jeg er ret ny i php verden - men det er da et forsøg værd. :)
Avatar billede thesurfer Nybegynder
31. december 2007 - 01:32 #2
Jeg er også selv ny i PHP, men jeg kan se at du mangler at lægge 1 til ("plusse" med en) her:

$row['s$i']

:-)
Avatar billede zynzz Praktikant
31. december 2007 - 10:46 #3
Dette vil nok nærmere virke med $row['s'.$i]

Thesurfer han laver jo increate med $i++... :)

eksempel:
for($i = 0; $i <= 7; $i++) {
if ($attackamount['$i'] > $row['s'.$i] ) { header('Location: attack.php'); exit; }
}
Avatar billede flodhesten Nybegynder
31. december 2007 - 11:06 #4
Er helt med på hvad du mener, thesurfer - men det er bare lige hvordan det udføres i praksis ;)

zynzz attackamount['$i'] skal være attackamount[$i], ellers fungerer det ikke.

Jeg har i midlertid prøvet mig lidt frem og jeg får et resultat med

for($i=0; $i<8; $i++) {
$o=$i+1;
if ($attackamount[$i] > $row['s'.$o]) { header('Location: attack.php'); exit; }
}
Avatar billede zynzz Praktikant
31. december 2007 - 11:09 #5
Ja det er min fejl... :), 2 sek så laver jeg også lige din sql... :)
Avatar billede zynzz Praktikant
31. december 2007 - 11:16 #6
Her er en lidt mindre sql, dog utestet..:
<?
$sql = "UPDATE users SET";

for($i = 1; $i <= 7; $i++) {
$endelse = ($i == 7) ? "" : "," ;
$sql .= "s".$i."=s".$i."-".($attackamount['0']-$aa['0']).$endelse;
}

$sql .= " WHERE username='". $_SESSION['user']."'";

$query = mysql_query($sql) or die(mysql_error());
?>
Avatar billede zynzz Praktikant
31. december 2007 - 11:21 #7
Og den nemmeste måde på nr. 2 ville nok være:

<?
$defenceamount = array();
for($i = 1; $i <= 8; $i++) {
array_push($defenceamount, $row[$i]);
}
?>
Avatar billede flodhesten Nybegynder
31. december 2007 - 11:45 #8
Af en eller anden årsag så duer nedenstående kode ikke.

$defenceamount = array();
for($i = 1; $i <= 8; $i++) {
array_push($defenceamount, $row[$i]);
}

Når jeg benytter mig af

for($i=0; $i<8; $i++) { echo $defenceamount[$i] . " "; } som burde udskrive alle oplysninger i mit array, viser ingenting andet end et mellemrum.
Avatar billede flodhesten Nybegynder
31. december 2007 - 11:48 #9
Og din sql:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=s1-12,s2=s2-12,s3=s3-12,s4=s4-12,s5=s5-12,s6=s6-12,s7=s7-12 WHERE username='pet' at line 1
Avatar billede zynzz Praktikant
31. december 2007 - 16:17 #10
Kan du ikke prøve at udskrive både den nye og den gamle ?

uden mysql_guery... ?

echo $sql;
Avatar billede zynzz Praktikant
31. december 2007 - 16:21 #11
Men den laver 8 felter ?
Avatar billede zynzz Praktikant
31. december 2007 - 16:27 #12
Eksempel nr. 2 virker altså fint..., jeg har selv testet det...
Avatar billede zynzz Praktikant
31. december 2007 - 16:28 #13
Men prøv at skrive: print_r($defenceamount);

for at se hvad dit array indeholder...
Avatar billede thesurfer Nybegynder
31. december 2007 - 16:29 #14
Jeg mente forholdet mellem attackamount og row ("s"):

$attackamount['0'] > $row['s1']

row er altid 1 højere end attackamount..

Jeg ville nok bare have lagt 1 til sådan her:

$attackamount['$i'] > $row['s' . $i + 1]

(ingen grund til en ekstra variabel)

Eller hvordan man nu gør i PHP.. :-)
Avatar billede zynzz Praktikant
31. december 2007 - 16:33 #15
Ja jeg så det godt senere hvad du mente, men det med +1 er en dum ide så bliver $i jo plusset med 2 hver gang...
Avatar billede flodhesten Nybegynder
31. december 2007 - 16:33 #16
Prøvede jeg også først thesurfer, men af en eller andet grund kan man ikek gøre sådan :P Så jeg fandt en alternattiv løsning.

Jeg vender lige tilbage i 2008.
Avatar billede thesurfer Nybegynder
31. december 2007 - 16:37 #17
zynzz> Nej, nu misforstår du mig.. :-)

Det er ikke $i skal pluses med 1.. det er værdien/indholdet af "$i", inden det smides sammen med "s"..

Eksempel:

$1 = 4;
s = $1 + 1;

giver:
s5
$1 = 4

:-)
Avatar billede thesurfer Nybegynder
31. december 2007 - 16:39 #18
flodhesten> Vender først tilbage om et år?? ;-)

Hvis $row['s' . $i + 1] ikke virker, prøv med "$row['s' . ($i + 1)]"..

Det plejer at hjælpe når man putter parenteser udenom matematiske operationer.. :-)
Avatar billede gammelhat Nybegynder
31. december 2007 - 16:44 #19
forklaringen på

's'.$i+1
vs
's'.($i+1)

findes her: http://dk2.php.net/operators
Avatar billede thesurfer Nybegynder
31. december 2007 - 16:49 #20
gammelhat> Kunne man få et hurtigt resume..? :-)

Jeg ville bruge "()" pga den måde man normalt samler ting..

Eksempel:
"hello" + "world" + 5 + 2 giver "helloworld52"
"hello" + "world" + (5 + 2) burde give "helloworld7"

Men nu bruger PHP jo "." til at samle ting (hedder vist "to concate"), så jeg var ikke helt sikker på det med "." og "+" når man så har tal/integers..
Avatar billede gammelhat Nybegynder
31. december 2007 - 16:59 #21
+ og . er lige vigtige, så den evaluerer udtrykket fra venstre mod højre.

"hello" . "world" . 5 + 2 vil i php give 2
Avatar billede gammelhat Nybegynder
31. december 2007 - 17:07 #22
'123' + 1

kan php godt finde ud af, da php automatisk konverterer strengen om til et tal først. En streng, som ikke kan laves om til et gyldigt tal, bliver lavet om til 0

's'.$i+1

bliver til 's1'+1
's1' kan ikke laves om til et tal, så det endelige resultat bliver: 0+1=1 (og ikke 's2')
Avatar billede flodhesten Nybegynder
20. januar 2008 - 00:56 #23
Beklager at jeg har glemt alt om denne tråd. zynzz, du er velkommen til at poste et svar.
Avatar billede zynzz Praktikant
20. januar 2008 - 01:03 #24
Hermed et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester