[php] voorwaardelijke operator

Pagina: 1
Acties:

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
ik heb een beetje problemen met de voorwaardelijke operator in PHP, de vorm van die operator is:
x ? y : z

x bevat de testvoorwaarde, als x een waarde teruggeeft ongelijk aan nul (dus TRUE), wordt y gekozen, anders is z het resultaat.

nu heb ik de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
function navigate($loc)
{
?>

...html geblaat...

<?php ($loc == "home") ?  ?> 
<b>Home</b>
<?php : ?>
<a href="index.php">Home</a>
....


als je dus de functie aanroept met navigate("home") krijg je:
Home
en anders een link naar Home.

als ik deze code test krijg ik een parse error bij de regel:
<?php ($loc == "home") ? ?>

weet iemand waarom?

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Je mixt server side met clientside. Volgens mij kan dat niet goed gaan....

https://fgheysels.github.io/


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

wat dacht je ervan om het woordje if erbij te zetten

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

ik was wat vlot
ff wat testen

Doet iets met Cloud (MS/IBM)


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Met het woordje if heeft het zeker niet te maken. Een ternary operator schrijf je zoals de TS dat gedaan heeft. Volgens mij heeft het gewoon te maken met de combi clientside/serverside.

Maar goed, who am i?

https://fgheysels.github.io/


  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 21:13
Oef beter lezen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Het ene vraagteken slaat op die ternary operator, het andere op ?>, dus ik denk ook niet dat het dat is.

https://fgheysels.github.io/


  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 21:13
Misschien kun je in plaats van het probleem op te lossen het probleem omzeilen door het op een andere manier te doen. Is ws. sneller dan dit op lossen.
En je sluit je function niet af voordat je je php aflsuit kan natuurlijk zijn omdat je knuipt maar post is je hele src plz.

* Eskimootje is nu ff koffie drinken brb

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
ja ik kan het probleem wel omzeilen, maar die operator moet toch gewoon werken?

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
ok de hele source:

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
30
31
32
33
<?php



// Navigation function
function navigate($loc)
{
?>

        <table width="100%" cellpadding="2" cellspacing="2" border="0">
        <tr>
        <th colspan="2" bgcolor="#123456"><font size="3">VNCS Mind</font><br>
        <font size="-2">- Knowledge is nothing without control -</font>
        </th>
        </tr>
        <tr bgcolor="#123456">
        <td align=left>

        [ <?php $loc == "home"? ?> <b>Home</b> <?php : ?> <a href="index.php">Home</a>
        | <?php $loc == "webdesign" ? ?> <b>Webdesign</b> <?php : ?> <a href="webdesign.php">Webdesign</a>
        | <?php $loc == "products" ? ?> <b>Products</b> <?php : ?> <a href="products.php">Products</a>
        | <?php $loc == "download" ? ?> <b>Download</b> <?php : ?> <a href="download.php">Download</a>
        | <?php $loc == "development" ? ?> <b>Development</b> <?php : ?> <a href="development.php">Development</a>
        | <?php $loc == "about" ? ?> <b>About</b> <?php : ?> <a href="about.php">About</a>
        | <?php $loc == "contact" ? ?> <b>Contact</b> <?php : ?> <a href="contact.php">Contact</a> ]

        </td><td align=right>
        <a href="javascript:addbookmark()">Bookmark</a>&nbsp;&nbsp;</td>
        </tr>
        </table>
<?php
}
?>


het is een file die ik op het begin van elke pagina include en dan de functie steeds gebruik.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

snie nodig die source

PHP:
1
2
3
<?php $blaat= ($loc == "home") ? "blaat" : "blaat2" ; 
echo "$blaat";
?>

Doet iets met Cloud (MS/IBM)


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Dit is niet echt de gebruikelijke manier om ?: toe te passen. Ik zou het gewoon zo doen
PHP:
1
2
3
4
5
6
7
8
9
if ($loc == 'home') {
?>
home
<?php
} else {
?>
link to home
<?php
}


De ?: is meer geschikt om een waarde toe te kennen aan een variabele. Dus
PHP:
1
 $a = $voorwaarde?$als_voorwaarde_true:als_voorwaarde_false;

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

echo aub die html code, dat staat al een stuk netter/is duidelijker

<?php
($loc == "contact") ? echo "blaat" : echo "moehoe";
?>

oogjes open, snaveltjes dicht


Verwijderd

moet het hele zooitje van x ? y : z niet op 1 regel zette?
gebruik anders gewoon if else???
wat is het probleem :?

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
Verwijderd schreef op 25 oktober 2002 @ 20:30:
moet het hele zooitje van x ? y : z niet op 1 regel zette?
gebruik anders gewoon if else???
wat is het probleem :?
het probleem is dat x ? y : z niet werkt, maar nu gebruik ik gewoon:
PHP:
1
2
3
4
5
if ($loc == "home") {
   echo "<b>Home</b>";
} else {
    echo "<a href=\"index.php\">Home</a>";
}


en dat werkt!

iedereen bedankt :)

Verwijderd

D2K:
<?php $blaat= ($loc == "home") ? "blaat" : "blaat2" ;
echo "$blaat";
?>


Het kan natuurlijk ook zo:
PHP:
1
echo ($loc == "home" ? "<b>Home</b>" : "<a href=\"index.php\">Home</a>");

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Sanchez schreef op 25 oktober 2002 @ 20:34:
[...]


het probleem is dat x ? y : z niet werkt, maar nu gebruik ik gewoon:
PHP:
1
2
3
4
5
if ($loc == "home") {
   echo "<b>Home</b>";
} else {
    echo "<a href=\"index.php\">Home</a>";
}


en dat werkt!

iedereen bedankt :)


En als je het als volgt schrijft:
PHP:
1
2
3
4
<?
var  echodinges;
echodinges =  ($loc == "home")? "<b>Home</b> : "<a href=......>home</a>";
?>


of
PHP:
1
2
3
<?
echo ($loc == "home")? "<b>Home</b>" : "<a href = >home</a>;
?>

https://fgheysels.github.io/


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18

killercow

eth0

ik zou alle opties in een array duwen en dan met inarray checken of de opgegeven waarde bestaat, zoja, dan echo je de waarde met eventueel een hoofdlettertje als eerste letter, lijkt mij makkelijker

[ Voor 0% gewijzigd door killercow op 26-10-2002 13:28 . Reden: hmm laat maar niet goed gelezen ]

openkat.nl al gezien?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:25
Even samenvatten: De operator ?: heeft alleen meerwaarde, als je het resultaat van de expressie ook gaat gebruiken. Anders is het een verkorte variant van "if (a) b; else c;" die echter aanzienlijk minder leesbaar is (zeker als de expressie ertussen veel ruimte innemen) en dus beter niet gebruikt kan worden.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

kortom, je moet 't als expressie gebruiken, niet als statement. (Net als overigens imo de 'or' operator :X)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Btw, volgens mij moet je die statements ook met een ; eindigen ;)
En dat miste een beetje in jouw source...

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Btw, wat een gebruikelijke methode voor een lijst als jij daar hebt is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
switch($loc)
{
    case 'home' :
        $val = "blaat";
        break;
    case 'about' :
        $val = "blaat1";
        break;
    case 'faq' :
        $val = "blaat2";
        break;
    default :
        $val = "blaat";
        break;
}
echo $val;

Kortom een switch-case boom :)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:25
NOFI en het spijt me dat ik dit kansloze onderwerp weer op moet rakelen, maar ACM heeft er schijnbaar niets van begrepen.

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 21:13
NOFI maar je praat poep, zeg dan waarom ten eerste dit onderwerp kansloos is en waarom ACM er nix van begrepen heeft. Alleen meedelen dat hij dr nix van begrepen heeft is natuurlijk zinloos.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

Soultaker schreef op 27 oktober 2002 @ 12:48:
NOFI en het spijt me dat ik dit kansloze onderwerp weer op moet rakelen, maar ACM heeft er schijnbaar niets van begrepen.

anders ga je ff ergens anders trollen?
_waarom_ zou ie er niets van begrepen hebben?

Doet iets met Cloud (MS/IBM)


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je kan ook beleefd zeggen dat ik er overheen gekeken had dat er af en toe wel en af en toe geen link geplaatst werd en dat de switch-case dus in dit geval niet toepasbaar is.

Niet elke opmerking die ik plaats is waar hoor, maar het betekend ook niet altijd dat ik er stellig van overtuigd ben dat mijn perceptie van de thread de enige mogelijke is en dat ik er dus geen f*ck van begrijp.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:25
Sla eens een woordenboek open onder de letter 'n', wil je?

Verder wil de topicstarter, voor zover ik begrepen heb, een typisch menuutje genereren. Zoiets dus:
[ aap | noot | mies ]

Elk menu-item moet aan te klikken zijn, behalve het item dat overeenkomt met de huidige pagina. Dat wordt in plaats daarvan vet gedrukt (klikken is zinloos, want je bent al op die pagina).

Er zijn twee dingen mis met ACM's suggestie. Ten eerste is het hier totaal niet van toepassing. Het is niet zo, dat de topicstarter alleen het item dat overeenkomt met het huidige item wil weergeven, of iets dergelijks (dat is het beste dat ik er met alle goede wil van de wereld van kan maken). Ten tweede illustreert zijn voorbeeld een typisch geval waarin gewoon een associated array gebruikt kan worden; zijn suggestie is nodeloos ingewikkeld, zonder dat er staat aangegeven in welke situaties dit patroon echt gebruikt zou moeten worden. Ik zou me doodschamen als ik op zulke code betrapt zou worden, laat staan dat ik 't hier zou durven plaatsen.

Verder is dit onderwerp kansloos omdat uit de PHP handleiding heel goed (met uitgebreide voorbeelden) duidelijk wordt hoe je de genoemde operator moet gebruiken en wat je met een if-then-else clausule kan doen. Stomme opmerkingen zoals die van whoami, D2k, jou en uiteindelijk dus ACM, maken dit tot onsamenhangend topic waarin allerlei verkeerde adviezen worden gegeven. Je zou bijna van ellende mensen aan gaan raden de PHP manual of een programmeerboek te lezen, om te weten te komen hoe het wel moet.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:25
Wel opvallend dat de mensen die bijdragen aan dit topic (mezelf en de topicstarter uitgezonderd) heel snel kunnen reageren als ze aangesproken worden, maar schijnbaar niet de moeite nemen om na te denken over wat ik (of de topicstarter, for that matter) bedoel. Als jullie gezonde verstand nou gebruiken, hoeven jullie ook geen loze reacties te plaatsen als "oef - beter lezen", "ik was wat vlot; ff testen" en als je die tijd dan gebruikt om de thread te lezen, dan zie je misschien ook waar mijn commentaar op slaat.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ten eerste, ik had daaroverheen gekeken, thank you very much.
Ten tweede, de trinary-operator is wel degelijk "correct" toe te passen hier (het is misschien niet de netste oplossing, maar ok)
Ten derde, ik ga me echt niet schamen als ik een dergelijke constructie gebruik, maar zal idd niet gauw zo weinig erin zetten dat je net zo goed een associative array kan toepassen.

Maar goed, ik heb jou ook weinig zinvolle input zien geven hier.

Misschien had je zo lief willen zijn zoiets te geven als voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$locations = array("home" => "homeurl", "faq" => "faqurl", ...);
foreach($locations as $location => $location_url)
{
    if($location == $loc)
    {
        echo "zonder url";
    }
    else
    {
        echo "met url";
    }
    // OF (maar dat mag niet van soultaker)
    ($location == $loc) ? echo "zonder url" : echo "met url";
}

Oid, magoed dat zal je ook wel fout vinden.

(owja, voor je het zegt, die $location_url zou idd overbodig kunnen zijn)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
ACM schreef op 27 oktober 2002 @ 13:16:
($location == $loc) ? echo "zonder url" : echo "met url";
Parse error: parse error, unexpected T_ECHO in d:\inetpub\wwwroot\test\blaat.php on line 3 :P

dit werkt niet omdat echo "bla" geen expressie is, met print werkt het wel, maar waarom zou je niet gewoon if gebruiken?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik gebruik zelf gewoon vrijwel altijd de if hoor :)

Magoed kan je dan nog herschrijven naar:
echo ($location == $loc) ? "zonder url" : "met url";
Wat lekker kort(er), vies(er) en onduidelijk(er) is :P
(ja, viezer is met een z)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:25
ACM schreef op 27 oktober 2002 @ 13:16:
Ten eerste, ik had daaroverheen gekeken, thank you very much.
Dat mag best hoor, maar dan zeg ik dat je het niet begrepen hebt. Dat was toch zo?
Ten tweede, de trinary-operator is wel degelijk "correct" toe te passen hier (het is misschien niet de netste oplossing, maar ok)
Dat kan wel, ja. Dat heb ik nooit ontkent
Ten derde, ik ga me echt niet schamen als ik een dergelijke constructie gebruik, maar zal idd niet gauw zo weinig erin zetten dat je net zo goed een associative array kan toepassen.
Jij en ik begrijpen dat (ik bedacht dat al toen ik m'n reactie typte) maar als je een voorbeeld geeft waar andere mensen van moeten leren, geef dan een goed voorbeeld. In jou voorbeeld was een associatieve array op z'n plaats.
Maar goed, ik heb jou ook weinig zinvolle input zien geven hier.
Voordat ik me begon te ergeren aan het erbarmelijke nivo van de reacties, had ik de gebruiksregels voor de ?:-operator samengevat. Dat leek me toch wel zinvolle input eigenlijk en ik denk dat drm het daar mee eens kon zijn, want die zij direct daarop hetzelfde, in meer formele termen.
Misschien had je zo lief willen zijn zoiets te geven als voorbeeld:
<knip>
Waarom geef je die code dan niet meteen? Daar kunnen we tenminste wat mee. Dat is ook precies wat ik bedoel met even rustig de thread doorlezen en dan een doordachte reactie plaatsen. Dit is precies de code die ik ook zou gebruiken. Waarom je denk dat ik geen ?: operator zou gebruiken snap ik niet; ik zou dat juist wel doen, alleen zou ik het dan wel zo doen:

PHP:
1
echo ($location == $loc) ? "zonder url" : "met url";

Want, om met drm's woorden te spreken: je moet de ?: als expressie gebruiken (anders gebruik je maar if-then-else; wel zo duidelijk). Bovendien elimineer je zo de redunante echo.

Mijn punt is vooral dat dit topic dusdanig vervuild is door de onzinnige en incorrecte reacties (van vooral regulars, nota bene) dat het nauwelijks meer als goed referentiemateriaal kan dienen. Ik roep zelf graag dat n00bs de search moeten gebruiken, voordat ze een vraag stellen, maar dan moet er wel wat zinnigs te vinden zijn.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Soultaker schreef op 27 oktober 2002 @ 13:31:
Dat mag best hoor, maar dan zeg ik dat je het niet begrepen hebt. Dat was toch zo?
Mwoh, er zit een verschil tussen iets niet "begrijpen" omdat je ergens overheen leest en iets domweg niet begrijpen (zelfs als je het goed leest).
Imho is dat ongeveer het verschil in nuance dat je hebt als je zegt "je hebt het vast niet goed gelezen" vs "je begrijpt er niks van".
Voordat ik me begon te ergeren aan het erbarmelijke nivo van de reacties, had ik de gebruiksregels voor de ?:-operator samengevat. Dat leek me toch wel zinvolle input eigenlijk en ik denk dat drm het daar mee eens kon zijn, want die zij direct daarop hetzelfde, in meer formele termen.
Dat was dan het enige wat je gedaan had tot die tijd.
Daarna kwam je opmerking dat ik er niks van begrepen had en zo goed zal de topicstarter daar niet mee geholpen zijn.
Waarom geef je die code dan niet meteen?
Had ik nog niet gezegd dat ik het fout gelezen had :?
PHP:
1
echo ($location == $loc) ? "zonder url" : "met url";
Sja, mijn voorbeeld was zelfs niet helemaal correct wat dat betreft, en dan is idd de echo voor de ? verplicht.
Maar de if-else is nog steeds duidelijker.
Mijn punt is vooral dat dit topic dusdanig vervuild is door de onzinnige en incorrecte reacties (van vooral regulars, nota bene) dat het nauwelijks meer als goed referentiemateriaal kan dienen. Ik roep zelf graag dat n00bs de search moeten gebruiken, voordat ze een vraag stellen, maar dan moet er wel wat zinnigs te vinden zijn.

En daar kan je op twee manieren voor zorgen.
Domweg zeggen dat alle voorbeelden fout zijn.
Of datzelfde met een goed voorbeeld...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
Je kunt echo niet als expressie evalueren, omdat 't een language construct is, en geen functie. Dat is ook de reden dat 't met print wel werkt.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:25
Gek is dat het met void-functies nog wel werkt (die evalueren schijnbaar naar false in die context). Niet echt mijn idee van een void return type, die geen return value zou moeten hebben.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Php is wel vaker inconsistent wat dat betreft :)
In principe is het returnen van een (niet lege) string ook geen 'true' natuurlijk.

(of nog leuker "false" == true)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
drm schreef op 27 oktober 2002 @ 13:48:
offtopic:
Je kunt echo niet als expressie evalueren, omdat 't een language construct is, en geen functie. Dat is ook de reden dat 't met print wel werkt.
offtopic:
print is eigenlijk ook een language construct. de reden dat het daarmee wel werkt is dat ie evalueert naar het argument (dus print("bla") geeft "bla" terug).
Pagina: 1