[PHP] Switch: meerdere cases groeperen in eigen "case"*

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • intermusic
  • Registratie: September 2002
  • Laatst online: 25-03 14:05

intermusic

Marc Hoekstra

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
switch ($invoer) {
   case "leeuwarden":
    // actie 1
       break;
   case "heerenveen":
    // actie 2
       break;
   case "kerkrade":
    // actie 3
       break;
   case "maastricht":
    // actie 4
       break;
   default:
    // actie default
       break;
}


Mijn vraag is hoe deze switch aan te passen zodat wanneer de provincie (friesland) als $invoer
wordt ingegeven, de acties 1 en 2 (leeuwarden en heerenveen) worden uitgevoerd. (evenals kerkrade en maastricht voor limburg) NB: ik wil iedere actie maar één keer vermelden in het script
Op zo'n manier dat wanneer de cases afzonderlijk opgeroepen worden, natuurlijk alleen maar die bijbehoren actie wordt uitgevoerd.

Heb al een paar dingen geprobeerd, zoals twee case functies (case "bla1": case "bla2") onder elkaar te zetten of een case herhalen, maar dat gaat niet goed.

[ Voor 10% gewijzigd door intermusic op 26-10-2005 00:04 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

if-functie van maken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch ($c)
      {
      case 1:
      case 2:
      case 3:
        a();

        b();

        c();

      case 4: break; // case with exactly one substatement

      default: break;
      }

dit zou moeten kunnen

*insert signature here


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
code:
1
2
3
4
5
6
switch ($i) {
   case ( ("leeuwarden") ||( "friesland" )):
   case ( ("heerenveen") || ("friesland" )):
   case "maastricht":
       break;
  }

Oftewel geen break; als er ook nog het volgende statement/case moet worden getest. En voor provincies een OR gebruiken ...

[ Voor 37% gewijzigd door djexplo op 26-10-2005 00:02 ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

djexplo schreef op woensdag 26 oktober 2005 @ 00:01:
code:
1
2
3
4
5
6
switch ($i) {
   case ( ("leeuwarden") ||( "friesland" )):
   case ( ("heerenveen") || ("friesland" )):
   case "maastricht":
       break;
  }

Oftewel geen break; als er ook nog het volgende statement/case moet worden getest. En voor provincies een OR gebruiken ...
Sinds wanneer kan een case een boolean expression evalueren en ermee vergelijken? :S

[ Voor 10% gewijzigd door prototype op 26-10-2005 00:06 ]


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
prototype schreef op woensdag 26 oktober 2005 @ 00:03:
[...]


Sinds wanneer kan een case een boolean expression evalueren en ermee vergelijken? :S
V.b. gekopierd van http://nl2.php.net/manual/nl/control-structures.switch.php maar er zijn inderdaad mensen die zeggen dat het niet kan en alternatieve code geven. Zo ie zo moet je het andwoord op het probleem van deze site kunnen halen...

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Nee, dat kan niet; zo kan je niet bij één provincie meerdere steden laten uitvoeren terwijl je ook die steden apart wilt laten uitvoeren.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

fall-through is dan handig:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$provincie = false;
switch ($invoer)
{
    case 'friesland':
        $provincie = true;

    case 'leeuwarden':
        // actie voor leeuwarden
        if (!$provincie) break;

    case 'heerenveen':
        // actie voor heerenveen
        break;
}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

djexplo schreef op woensdag 26 oktober 2005 @ 00:08:
V.b. gekopierd van http://nl2.php.net/manual/nl/control-structures.switch.php maar er zijn inderdaad mensen die zeggen dat het niet kan en alternatieve code geven. Zo ie zo moet je het andwoord op het probleem van deze site kunnen halen...
Daar hebben ze een andere constructie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
switch (true)
{
  case ($conditie1 || $conditie3):
    //doe wat
    break;
  case ($conditie2 || $conditie3):
    //doe wat
    break;
  case ($conditie1 && $conditie2):
    //doe wat
    break;
}

Zo vergelijk je boolean met boolean, en dat kan wel. Wat jij deed kan echter niet. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

-NMe- schreef op woensdag 26 oktober 2005 @ 00:13:
[...]

Daar hebben ze een andere constructie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
switch (true)
{
  case ($conditie1 || $conditie3):
    //doe wat
    break;
  case ($conditie2 || $conditie3):
    //doe wat
    break;
  case ($conditie1 && $conditie2):
    //doe wat
    break;
}

Zo vergelijk je boolean met boolean, en dat kan wel. Wat jij deed kan echter niet. :)
imo kan je dan beter een if-block gebruiken dan dit, dit is namelijk veel onoverzichtelijker.

Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 01:59

aex351

I am the one

Maak gebruik van een array vooraf met een check functie. Waarna je met die output de switch pas binnen gaat.

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Erkens schreef op woensdag 26 oktober 2005 @ 00:17:
imo kan je dan beter een if-block gebruiken dan dit, dit is namelijk veel onoverzichtelijker.
Uiteraard, ik gaf dit dan ook alleen aan om het verschil tussen zijn switch en die op PHP.net weer te geven, niet om aan te geven dat het hier toepasbaar is.

Ik zou zelf trouwens doen wat aex351 zegt: een check-functie maken die controleert in welke provincie de huidige plaats zit, en die provincie returnen. Dan heb je in je switch alleen maar provincies nodig. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

-NMe- schreef op woensdag 26 oktober 2005 @ 00:13:
[...]

Daar hebben ze een andere constructie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
switch (true)
{
  case ($conditie1 || $conditie3):
    //doe wat
    break;
  case ($conditie2 || $conditie3):
    //doe wat
    break;
  case ($conditie1 && $conditie2):
    //doe wat
    break;
}

Zo vergelijk je boolean met boolean, en dat kan wel. Wat jij deed kan echter niet. :)
Ik dacht dat switch cases alleen werkte met int/char en enum constants. :S

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

prototype schreef op woensdag 26 oktober 2005 @ 01:03:
Ik dacht dat switch cases alleen werkte met int/char en enum constants. :S
Dat is C/C++. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
-NMe- schreef op woensdag 26 oktober 2005 @ 00:44:
[...]Ik zou zelf trouwens doen wat aex351 zegt: een check-functie maken die controleert in welke provincie de huidige plaats zit, en die provincie returnen. Dan heb je in je switch alleen maar provincies nodig. :)
Ehm.. nee; dan doe je niet meer wat de TS vraagt. Je voert dan voor elke plaats in een provincie hetzelfde uit. De TS wil verschillende dingen doen:

TS:
leeuwarden -> actie 1
heerenveen -> actie 2
friesland -> actie 1 en 2

NMe:
leeuwarden -> zie friesland
heerenveen -> zie friesland
friesland -> actie 1 en 2

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Ah, en java ;)

Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 01:59

aex351

I am the one

Birdie schreef op woensdag 26 oktober 2005 @ 01:15:
[...]

Ehm.. nee; dan doe je niet meer wat de TS vraagt. Je voert dan voor elke plaats in een provincie hetzelfde uit. De TS wil verschillende dingen doen:

TS:
leeuwarden -> actie 1
heerenveen -> actie 2
friesland -> actie 1 en 2

NMe:
leeuwarden -> zie friesland
heerenveen -> zie friesland
friesland -> actie 1 en 2
Nee dat is niet waar, je kunt met een array data sorteren/groeperen. Dus dat betekend dat vrijwel alle wensen van de TS gedekt zijn.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Een klein voorbeeld

// haal var op : 
$input = $_GET['stad'];

// snelle voorbeeld waarbij je ziet dat amsterdam niet in de provincie flevoland toebehoort 
// maar wel zal worden uitgevoert in de provincie flevoland

$FLEVOLAND = array (almere,amsterdam) ;
if (in_array($input, $FLEVOLAND) { 
        //dit word gebruikt in de switch
        $output = 'FLEVOLAND' ; 
}

[ Voor 46% gewijzigd door aex351 op 26-10-2005 01:57 ]

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
aex351 schreef op woensdag 26 oktober 2005 @ 01:45:
[...]
Nee dat is niet waar, je kunt met een array data sorteren/groeperen. Dus dat betekend dat vrijwel alle wensen van de TS gedekt zijn.
Afgezien van het feit dat Amsterdam niet in Flevoland ligt ;). Dit is niet wat TS wil. TS heeft een actie voor Almere en een actie voor Lelystad. Als een van deze in $invoer zit moet de individuele actie worden uitgevoerd. Is $invoer 'Flevoland', dan moeten beide uitgevoerd worden. Dat is iets anders dan eerst bepalen in welke provincie een stad ligt en dan de provinciecode uitvoeren. Het juiste antwoord (in elk geval als er een switch() gebruikt moet worden) staat in de post van Crisp hierboven :)

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 01:59

aex351

I am the one

T-MOB schreef op woensdag 26 oktober 2005 @ 02:16:
[...]

Afgezien van het feit dat Amsterdam niet in Flevoland ligt ;). Dit is niet wat TS wil. TS heeft een actie voor Almere en een actie voor Lelystad. Als een van deze in $invoer zit moet de individuele actie worden uitgevoerd. Is $invoer 'Flevoland', dan moeten beide uitgevoerd worden. Dat is iets anders dan eerst bepalen in welke provincie een stad ligt en dan de provinciecode uitvoeren. Het juiste antwoord (in elk geval als er een switch() gebruikt moet worden) staat in de post van Crisp hierboven :)
Precies Amsterdam ligt niet in Flevoland, dat was ook de opzet van mijn voorbeeld. Om te laten zien dat met een array je veel vrijheid hebt betreft sorteren/groeperen. Verder voldoet mijn voorbeeld naar mijn inzicht prima aan de eisen van de TS, het enige dat moet gebeuren is het verder uitbouwen. Aangezien het maar een simpel voorbeeld is.

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

aex351: ik ben bang dat Birdie en T-MOB gelijk hebben. Ik dacht er ook wat te licht over geloof ik; wanneer TS een verschillende actie per stad wil doen, en alle acties die bij de steden uit een provincie horen wanneer er een provincie meegegeven is, dan kom je al snel op een oplossing zoals die van crisp uit, of op een oplossing zonder switch maar met een hoop (geneste) ifs.
Vermoedelijk elke strong typed taal waarvan de syntax op C lijkt. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • soulrider
  • Registratie: April 2005
  • Laatst online: 27-11-2017
Waarom wordt er geen gebruik gemaakt van procedure-aanroepen voor die actie's?

dan moet je die actie's ook maar éénmaal vermelden ;) :+

in die swatch en case's moet je dan mss wel meermaals dezelfde procedure aanroepen...

Maar het gevraagde is wel verkregen: je moet maar op 1 plaats je actie's aanpassen :)
omdat ze er maar 1x instaan: in de des betreffende procedure...

volgens mij is dat nog makkelijker dan proberen te spelen met switch-case's en if-statements...

er zijn mengelmoezen mogelijk maar die code is na 1 maand wrs niet meer leesbaar.
en dus moeilijk onderhoudbaar dan voor jezelf


pseudo-code (dus niet copy-paste: zoek zelf juiste code & codeerstyle op :p)

code:
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
switch ($invoer) {
   case "friesland":
   case "leeuwarden":
   case "heerenveen":
      if( "friesland" OR "leeuwarden") {
    // actie 1   
      } // end if
      if( "friesland" OR "heerenveen") {
    // actie 2
      } // end if
       break;
   case "limburg":
   case "kerkrade":
   case "maastricht":
     if ("limburg" OR "kerkrade"){
    // actie 3
      } // end if
     if("limburg" OR "maastricht"){
    // actie 4
      } // end if
       break;
   default:
       // actie default
       break;
}


Of the fall through van crips - damn, slimmere & compactere coding-style, tijdje te lang geleden dat ik me nog eens in code verdiept hebt. _/-\o_

[ Voor 27% gewijzigd door soulrider op 26-10-2005 03:10 . Reden: wat haakjes en comment in code gezet ter veduidelijking ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

soulrider: waarom überhaupt nog die switch gebruiken? Je ifs vangen alles al af. 8)7

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op woensdag 26 oktober 2005 @ 07:59:
soulrider: waarom überhaupt nog die switch gebruiken? Je ifs vangen alles al af. 8)7
offtopic:
Ik zie dit soort oplossingen vaker langs komen de laatste tijd (zeg 6 maanden) hier op GoT, ik zeg er nooit niets van. Moeten ze de handleiding maar lezen. Vaak zie ik overdreven moeilijke dingen die echt veel makkelijker kunnen, mits ze de handleiding lezen, en een beetje inzich hebben in wat ze doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 26 oktober 2005 @ 09:10:
offtopic:
Ik zie dit soort oplossingen vaker langs komen de laatste tijd (zeg 6 maanden) hier op GoT, ik zeg er nooit niets van. Moeten ze de handleiding maar lezen. Vaak zie ik overdreven moeilijke dingen die echt veel makkelijker kunnen, mits ze de handleiding lezen, en een beetje inzich hebben in wat ze doen.
Van een handleiding heeft niemand leren programmeren. Het is net een rijbewijs, je kunt pas autorijden als je een paar jaar je bewijs hebt. Mensen leren van vallen en opstaan...

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom niet gewoon met een setje IF-constructies werken binnen een functie, dus iets als;

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function acties($input)
{

    // case 1
    if($input==('leeuwarden'||'friesland')) {
        // actions 1
    }

    // case 2
    if($input==('heerenveen'||'friesland')) {
        // actions 2
    }

    // etc.

}

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op woensdag 26 oktober 2005 @ 10:37:
Waarom niet gewoon met een setje IF-constructies werken binnen een functie, dus iets als;

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function acties($input)
{

    // case 1
    if($input==('leeuwarden'||'friesland')) {
        // actions 1
    }

    // case 2
    if($input==('heerenveen'||'friesland')) {
        // actions 2
    }

    // etc.

}
case 1 en 2 in jouw geval worden alleen uitgevoerd als $input = true anders nooit ;)

een typische beginnersfout :*
een string evalueerd in php naar true, ('heerenveen'||'friesland') zal dus ook true teruggeven, immers true||true is true ;)

[ Voor 19% gewijzigd door Erkens op 26-10-2005 10:44 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik prefereer zelf een wat generiekere aanpak:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function actie1()
{
    echo "actie1";
}

function actie2()
{
    echo "actie2";
}

$plaatsen = array
(
    "leeuwarden" => array ("actie1"),
    "heerenveen" => array ("actie2"),
    "friesland" => array ("actie1", "actie2")
);


if (isset ($plaatsen[$input]))
    foreach ($plaatsen[$input] as $actie)
        $actie();

[ Voor 6% gewijzigd door .oisyn op 26-10-2005 11:31 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Erkens schreef op woensdag 26 oktober 2005 @ 10:43:
[...]

case 1 en 2 in jouw geval worden alleen uitgevoerd als $input = true anders nooit ;)

een typische beginnersfout :*
een string evalueerd in php naar true, ('heerenveen'||'friesland') zal dus ook true teruggeven, immers true||true is true ;)
Klein foutje (komt men snel genoeg achter als er getest wordt, maar het was i.d.d. ietwat slordig (Ivy heeft koffie nodig));

Komt 'ie alsnog, het idee was wel duidelijk denk ik:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function acties($input)
{

    // case 1
    if($input=='leeuwarden'||$input=='friesland') {
        // actions 1
        echo 1;
    }

    // case 2
    if($input=='heerenveen'||$input=='friesland') {
        // actions 2
        echo 2;
    }

    // etc.

}

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

.oisyn schreef op woensdag 26 oktober 2005 @ 11:31:
Ik prefereer zelf een wat generiekere aanpak:

PHP:
1
2
3
if (isset ($plaatsen[$input]))
    foreach ($plaatsen[$input] as $actie)
        $actie();
Ik zou zelf nooit voor zo'n constructie kiezen met variabele functioncalls (iig op deze manier).

Maar als je het toch zo wilt doen zou ik toch er nog eerst een function_exists() overheen gooien :)

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Verwijderd schreef op woensdag 26 oktober 2005 @ 11:32:
[...]


Klein foutje (komt men snel genoeg achter als er getest wordt, maar het was i.d.d. ietwat slordig (Ivy heeft koffie nodig));

Komt 'ie alsnog, het idee was wel duidelijk denk ik:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function acties($input)
{

    // case 1
    if($input=='leeuwarden'||$input=='friesland') {
        // actions 1
        echo 1;
    }

    // case 2
    if($input=='heerenveen'||$input=='friesland') {
        // actions 2
        echo 2;
    }

    // etc.

}
zodra je overdreven herhaling in je code ziet weet je dat er iets niet optimaal is. In jouw geval zou er een paar honderd keer (bijvoorbeeld) ||$input=='provincie' komen te staan...

Nu moet het lampje gaan branden: 'Dit is geen handige oplossing...' ;)

Bovendien staan de definities van de data (plaatsnamen/provincienamen) heel ver van elkaar vandaan omdat ze gescheiden zijn door alle uitvoerende code. Resultaat is onoverzichtelijkheid en slechte beheerbaarheid..

[ Voor 23% gewijzigd door Bosmonster op 26-10-2005 11:39 ]


Acties:
  • 0 Henk 'm!

  • Huppie
  • Registratie: Mei 2003
  • Laatst online: 02-09 09:59
Met een beetje creatief omgaan met de oplossing van aex352 kom je toch echt een heel eind. Het voorbeeld dat aex352 geeft is dan wel niet correct op wat de TS wilt maar met zijn principe zou je er toch moeten kunnen komen. Mijns insziens zou de oplossing er zo uit komen te zien:
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
26
27
28
29
<?php
    // Voorbeeld
    $input = $_GET['provincieofstad'];
    
    $provincies = array('friesland'=>array('heerenveen', 'leeuwarden'));
    
    // Controleer of de ingevoerde 'provincieofstad' bestaat in de provincies array.
    if (array_key_exists($input,$provincies)){
        // Zo ja, voer voor iedere stad in die provincie de bijbehorende actie uit.
        foreach ($provincies[$input] as $stad){
            actieBijStad($stad);
        }
    }
    else {
        // Zo nee, voer alleen voor de betreffende stad de bijbehorende actie uit.
        actieBijStad($input);
    }
    
    function actieBijStad($stad){
        switch ($stad){
            case 'heerenveen':
                // actie
                break;
            case 'leeuwarden':
                // actie
                break;
        }
    }
?>

Proud member of TCF - D2OL is zooooo 2005


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
intermusic schreef op dinsdag 25 oktober 2005 @ 23:55:
Mijn vraag is hoe deze switch aan te passen zodat wanneer de provincie (friesland) als $invoer
wordt ingegeven, de acties 1 en 2 (leeuwarden en heerenveen) worden uitgevoerd. (evenals kerkrade en maastricht voor limburg) NB: ik wil iedere actie maar één keer vermelden in het script
Op zo'n manier dat wanneer de cases afzonderlijk opgeroepen worden, natuurlijk alleen maar die bijbehoren actie wordt uitgevoerd.
Dit in een functie zetten en in de aanroepende functie switchen op provincie en daar meerdere keren de functie met de switch op plaats aanroepen.

Net zoals [rml]Huppie in "[ PHP] Switch: meerdere cases groeperen i..."[/rml] dus.

[ Voor 7% gewijzigd door Olaf van der Spek op 26-10-2005 11:54 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Erkens schreef op woensdag 26 oktober 2005 @ 11:36:
[...]

Ik zou zelf nooit voor zo'n constructie kiezen met variabele functioncalls (iig op deze manier).
Wat is er mis met functiepointers? 't Is jammer dat het in PHP via strings moet, maar je moet roeien met de slecht ontworpen riemen die je hebt. Je zou het evt. nog via call_user_func() kunnen doen, dan kun je tevens ook methods op objecten aanroepen, maar dat is slechts een technicality en doet niets af aan het ontwerp.
Maar als je het toch zo wilt doen zou ik toch er nog eerst een function_exists() overheen gooien :)
Waarom? Het is toch gewoon je eigen code? Je weet toch dat die functies bestaan? Je gaat toch ook niet, als je een functie DoeIets() definieert, eerst kijken of die functie wel bestaat voor je 'm aan gaat roepen? Je script geeft vanzelf een error, en of je nou function_exists gebruikt of niet, je script blijft fout en je doet er op dat moment weinig aan. (Wat ga je doen als hij niet blijkt te bestaan, hem maar gewoon niet aanroepen?)

[ Voor 5% gewijzigd door .oisyn op 26-10-2005 12:33 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

.oisyn schreef op woensdag 26 oktober 2005 @ 12:32:
Wat is er mis met functiepointers? 't Is jammer dat het in PHP via strings moet, maar je moet roeien met de slecht ontworpen riemen die je hebt. Je zou het evt. nog via call_user_func() kunnen doen, dan kun je tevens ook methods op objecten aanroepen, maar dat is slechts een technicality en doet niets af aan het ontwerp.
niks mis met functiepointers, maar ik vind dit gewoon niet een mooie oplossing, en over het algemeen komt de onderhoudbaarheid van een stuk code met daarin functionpointers niet echt ten goede imo.
Waarom? Het is toch gewoon je eigen code? Je weet toch dat die functies bestaan? Je gaat toch ook niet, als je een functie DoeIets() definieert, eerst kijken of die functie wel bestaat voor je 'm aan gaat roepen?
Zodra je met dit soort dingen bezig gaat "functiepointers" ben ik van mening dat je zorg moet dragen voor eventuele exceptions die kunnen voorkomen door het niet bestaan van een functie. Nu is die code nog wel duidelijk, maar is dat over een paar maanden nog zo? Of als iemand anders verder moet met die code?
Je script geeft vanzelf een error, en of je nou function_exists gebruikt of niet, je script blijft fout en je doet er op dat moment weinig aan. (Wat ga je doen als hij niet blijkt te bestaan, hem maar gewoon niet aanroepen?)
Ja het script geeft een fatal error die je niet kan afvangen met PHP, handig :Y)
zelf zou ik alsnog een error opwerpen (trigger_error) maar dan wel zo dat die eventueel door een eigen exception handler kunnen of iig een duidelijke foutmelding geven waarom het fout gaat.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Erkens schreef op woensdag 26 oktober 2005 @ 12:38:
[...]

niks mis met functiepointers, maar ik vind dit gewoon niet een mooie oplossing, en over het algemeen komt de onderhoudbaarheid van een stuk code met daarin functionpointers niet echt ten goede imo.
Juist wél, je hebt een duidelijke array in je code staan die je makkelijk kunt uitbreiden, ipv te gaan lopen knoeien in een veel te grote switch statement met het occasional vergeten break statement risico van dien. Maar goed, wat dat betreft verschillen we gewoon van mening, soit :)
Zodra je met dit soort dingen bezig gaat "functiepointers" ben ik van mening dat je zorg moet dragen voor eventuele exceptions die kunnen voorkomen door het niet bestaan van een functie. Nu is die code nog wel duidelijk, maar is dat over een paar maanden nog zo? Of als iemand anders verder moet met die code?
Wou je zeggen dat het met een switch statement wél duidelijk is dan?
Ja het script geeft een fatal error die je niet kan afvangen met PHP, handig :Y)
Euh
PHP:
1
woei();

Geeft exact dezelfde error. Verschil? Nogmaals, het is een grote bug in je code, je gaat ook niet dit doen:
PHP:
1
2
3
if (!function_exists("woei"))
    die("blaat");
woei();

Voor elke functie die je aanroept.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

.oisyn schreef op woensdag 26 oktober 2005 @ 12:45:
Wou je zeggen dat het met een switch statement wél duidelijk is dan?
ik zou zelf kiezen voor een soortgelijke constructie zoals Huppie die gaf, misschien geen switch maar iets anders. Ik zou gewoon niet van variabele functie calls :)
Euh
PHP:
1
woei();

Geeft exact dezelfde error. Verschil? Nogmaals, het is een grote bug in je code, je gaat ook niet dit doen:
PHP:
1
2
3
if (!function_exists("woei"))
    die("blaat");
woei();

Voor elke functie die je aanroept.
ehm,ik heb het niet over elke functie, alleen zou ik het gewoon altijd aftesten de functie die je wilt aanroepen via zo'n string of die bestaat en een betere foutmelding geven waar je wat aan hebt.
Pagina: 1