Avatar billede celfa Nybegynder
14. maj 2013 - 09:22 Der er 7 kommentarer og
1 løsning

Loop med mange else ifs

Hej :)
Jeg er igang med et lille projekt hvor jeg prøver at vise om en maskine er ledig udfra et 0 eller 1 tal i min database. Dernæst ville jeg også kigge på ureglmæssigheder i maskinen, dette gør jeg ved at have en "ref" og en "live" værdi som skal sammenholdes. Det der er ens i de 2 strings skal divideres med antallet af reference værdier og ganges med 100. Således har jeg sat en grænseværdi til at være 90, det vil sige at hvis ensheden imellem de 2 strings er mindre end 90 skal den melde fejl, er den over er alt som det skal være

Jeg er i tvivl om min kode er rigtig, da jeg aldrig har prøvet at lave et loop med så mange else ifs før.

Fejl koden er at:
else if ($sammenlign>"90" && $ledig=="xx")
Her siger den at variablen $sammenlign ikke findes?

Håber meget der er end der kan hjælpe mig.


<?php
$i=0;
while ($i < $num) {

$maskin_id=mysql_result($result,$i,"maskin_id");
$ledig=mysql_result($result,$i,"status");
$ref=mysql_result($result,$i,"ref");
$live=mysql_result($result,$i,"live");

if ($ledig=="0")

{
echo "Ledig!";

$ens = implode( '' , array_intersect( str_split($ref) , str_split($live) ) );

$sammenlign = strlen($ens)/(strlen($ref))*100;
echo $sammenlign;

}
else if ($sammenlign>"90" && $ledig=="0")
{
    echo "Maskinen virker!<br>";

}
else if($sammenlign<"90" && $ledig=="0")
{
   
    echo "Maskinen oplever ureglmæssigheder!<br>";
   
}
 

else if ($ledig=="1")

{
echo "Optaget!";
$ens = implode( '' , array_intersect( str_split($ref) , str_split($live) ) );
$sammenlign = strlen($ens)/(strlen($ref))*100;
echo $sammenlign;

}
else if ($sammenlign>"90" && $ledig=="1")
{
    echo "Maskinen virker!<br>";

}
else
{
   
    echo "Maskinen oplever ureglmæssigheder!<br>";
   
}


$i++;
}

?>
Avatar billede repox Seniormester
14. maj 2013 - 09:42 #1
Det er en Notice og ikke en fejl du får frem.

Den notice kommer fordi du ganske rigtigt ikke har sat variablen $sammenlign når du skal bruge den.

I dit første gennemløb i din loop, er variablen $ledig ikke 0 og du springer derfor ikke ind i den første if-sætning, hvor du laver din $sammenlign variabel. Du springer derimod ned i den næste if-sætning, men der har du slet ikke variablen.

Du skal have flyttet variabel erklæringen af $ens og $sammenlign op til de andre (da jo faktisk er ens alle gangene du skriver dem, giver det heller ikke mening at skrive dem gang på gang.

Du bør også optimere din kode væsentligt - lav indentering for læsbarhed, brug en for-løkke i stedet for en while når du har muligheden for det og nest dine if-sætninger. Vær konsekvent i den måde du skriver koden på; du hopper mellem at have og ikke have mellemrum før og efter kommaer, paranteser og operatorere.

En mere læsbar og optimeret udgave af din kode vil se nogenlunde således ud:


<?php
for ($i = 0; $i < $num; $i++)
{
    $maskin_id = mysql_result($result, $i, "maskin_id");
    $ledig = mysql_result($result, $i, "status");
    $ref = mysql_result($result, $i, "ref");
    $live = mysql_result($result, $i, "live");

    $ens = implode('', array_intersect(str_split($ref), str_split($live)));
    $sammenlign = strlen($ens)/(strlen($ref))*100;

    if ($ledig == 0)
    {                       
        echo "Ledig!";       
    }
    else if ($sammenlign > 90 && $ledig == 0)
    {
        echo "Maskinen virker!<br>";
    }
    else if($sammenlign < 90 && $ledig == 0)
    {   
        echo "Maskinen oplever ureglmæssigheder!<br>";   
    }
    else if ($ledig == 1)
    {
        echo "Optaget!";
    }
    else if ($sammenlign > 90 && $ledig == 1)
    {
        echo "Maskinen virker!<br>";
    }
    else
    {
        echo "Maskinen oplever ureglmæssigheder!<br>";   
    }
}

?>


MySQL er også deprecated og det anbefales ikke længere at anvende den - se her: http://dk1.php.net/manual/en/intro.mysql.php
Se hellere på MySQLi - http://php.net/mysqli eller PDO - http://php.net/pdo
Jeg har skrevet en guide til MySQL på http://err0r.dk/artikler/vis/mysqli-for-begyndere
Avatar billede celfa Nybegynder
14. maj 2013 - 10:02 #2
Mange tak for dit svar! Ja det var da godt nok en hjerneblødning og gentage $ens og $sammenlign..

Jeg har prøvet dit foreslag nu:
for ($i = 0; $i < $num; $i++)
{
    $maskin_id = mysql_result($result, $i, "maskin_id");
    $ledig = mysql_result($result, $i, "status");
    $ref = mysql_result($result, $i, "ref");
    $live = mysql_result($result, $i, "live");

    $ens = implode('', array_intersect(str_split($ref), str_split($live)));
    $sammenlign = strlen($ens)/(strlen($ref))*100;

    if ($ledig == 0)
    {                       
        echo "Ledig!<br>"; 
   
    }
    else if ($sammenlign > 90 && $ledig == 0)
    {
        echo "Maskinen virker!<br>";
    }
    else if ($sammenlign < 90 && $ledig == 0)
    {   
        echo "Maskinen oplever ureglmæssigheder!<br>";   
    }
    else if ($ledig == 1)
    {
        echo "Optaget!<br>";
    }
    else if ($sammenlign > 90 && $ledig == 1)
    {
        echo "Maskinen virker!<br>";
    }
    else
    {
        echo "Maskinen oplever ureglmæssigheder!<br>";   
    }
}

?>


Men uanset hvad jeg gør, så får jeg kun ledig og optaget. Jeg får ikke nogle af dem med
($sammenlign > 90 && $ledig == xx) frem.

Jeg har prøvet at echo $ens og $sammenlign, og de har præcis den værdi de skal have. Fejlen må ligge omkring den else if statement, da det konsekvent er dem den ikke udfører. Altså dem der siger Maskinen virker og Maskinen oplever ureglmæssigheder.
Avatar billede finb Ekspert
14. maj 2013 - 10:40 #3
er der en
select case
i php ?
Avatar billede celfa Nybegynder
14. maj 2013 - 10:58 #4
Ikke i min kode? Har læst om switch case før, men har ikke rigtig brugt det, og ved ikke om det kan bruges i denne sammenhæng.
Avatar billede erikjacobsen Ekspert
14. maj 2013 - 11:10 #5
Der er vel kun 4 muligheder, og du skal lige tage højde fo at den kan blive præcis 90. Så forslag

  if ($ledig == 0)  {                     
        if ($sammenlign >= 90 && $ledig == 0)  {
          echo "Ledig og Maskinen virker!<br>";
        } else {
          echo "Ledig og Maskinen oplever ureglmæssigheder!<br>";   
        }
    } else {
      if ($sammenlign >= 90) {
        echo "Optaget men Maskinen virker!<br>";
      } else {
        echo "Optaget men Maskinen oplever uregelmæssigheder!<br>"; 
      }
    }
Avatar billede erikjacobsen Ekspert
14. maj 2013 - 11:11 #6
Det var lige knap godt nok:

if ($ledig == 0)  {                   
        if ($sammenlign >= 90)  {
          echo "Ledig og Maskinen virker!<br>";
        } else {
          echo "Ledig og Maskinen oplever ureglmæssigheder!<br>"; 
        }
    } else {
      if ($sammenlign >= 90) {
        echo "Optaget men Maskinen virker!<br>";
      } else {
        echo "Optaget men Maskinen oplever uregelmæssigheder!<br>";
      }
    }
Avatar billede celfa Nybegynder
14. maj 2013 - 11:48 #7
Årh fantastisk! Det havde jeg slet ikke tænkt over med 2 if, troede jeg ikke man kunne. :)

Fedt, tak for det!

Smid et svar erikjacobsen.
Avatar billede erikjacobsen Ekspert
14. maj 2013 - 11:50 #8
Jeg samler slet ikke på point, tak. ;)
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