isset en waarde direct binnenhalen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Ozzie PHP

Ozzie PHP

13/11/2013 20:22:47
Quote Anchor link
Ik ben er eigenlijk vrij zeker van dat het niet kan... maar toch, misschien kent iemand hier een geweldig trucje waardoor het wel mogelijk is...

Is het mogelijk om te kijken of een array-key geset is, en gelijktijdig de bij behorende array value op te halen?

Stel ik heb een array waar ik iets uit wil ophalen, en ik wil eerst controleren of de key geset is, dan moet ik nu dit doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if (isset($array['foo'])) {
  $foo = $array['foo'];
}

?>

Ik moet dus 2x de array-key aanspreken, 1x om te kijken of ie wel bestaat, en vervolgens nog een keer om de waarde op te halen. Beetje omslachtig eigenlijk. Ik vroeg me af of zoiets ook in 1x kan... alhoewel ik dus vermoed van niet.
 
PHP hulp

PHP hulp

23/12/2024 18:27:27
 
Pipo Clown

Pipo Clown

13/11/2013 20:45:23
Quote Anchor link
Kijk hier eens :

http://php.net/manual/en/function.array.php

Ik ben er vrij zeker van dat je zult vinden wat je zoekt bij array_key_exists.
Gewijzigd op 13/11/2013 20:47:08 door Pipo Clown
 
Ozzie PHP

Ozzie PHP

13/11/2013 20:48:47
Quote Anchor link
@pipo: ik denk dat je mijn vraag niet begrijpt.
 
- SanThe -

- SanThe -

13/11/2013 20:55:09
Quote Anchor link
Dat doe ik altijd zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$foo
= (isset($array['foo'])) ? $array['foo'] : '';
?>


Blijft wel twee keer $array gebruiken..
 
Ozzie PHP

Ozzie PHP

13/11/2013 20:58:33
Quote Anchor link
Komt inderdaad op hetzelfde neer. Je spreekt nog steeds 2x de array aan. Ik denk ook dat het niet anders kan. Maar het is zonde dat je op het moment dat je controleert of ie bestaat dat je 'm dan ook niet gelijk kunt ophalen. Een soort van $foo = getKeyIfExists($array, 'foo');

Maar je, het zit er helaas niet in ben ik bang :)
 
- SanThe -

- SanThe -

13/11/2013 21:07:15
Quote Anchor link
Ik denk het ook niet.

Je kan het altijd nog op de zeer foute manier doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$foo
= @$array['foo'];
?>

Je weet dan alleen nooit echt wat er in zit.
Gewijzigd op 13/11/2013 21:07:41 door - SanThe -
 
Ozzie PHP

Ozzie PHP

13/11/2013 22:47:17
Quote Anchor link
Mja... ook niet echt de manier, haha...
 
Ruben Vincenten

Ruben Vincenten

13/11/2013 23:29:00
Quote Anchor link
Je kan er een functie van maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function array_value(&$array, $key, $default = null){
 return is_array($array) && isset($array[$key]) ? $array[$key] : $default;
}

?>
 
Ozzie PHP

Ozzie PHP

13/11/2013 23:32:54
Quote Anchor link
Ja, dat kan, maar dan nog steeds moet je 2x de array-key benaderen. Het verandert de situatie niet.

(Waarom geef je de array by reference door?)
 
Ruben Vincenten

Ruben Vincenten

14/11/2013 00:06:55
Quote Anchor link
Ozzie PHP op 13/11/2013 23:32:54:
Ja, dat kan, maar dan nog steeds moet je 2x de array-key benaderen. Het verandert de situatie niet.

PHP heeft standaard geen functie hiervoor, je kan de functies isset en array_key_exists gebruiken om te controleren of een key bestaat in een array. Deze functies halen de value echter niet op omdat in strijd zou zijn met het doel van de functie zelf.
Quote:
(Waarom geef je de array by reference door?)
Heb het even opgezocht maar inderdaad, normaal doorgeven is beter. De functie past namelijk de array niet aan.
 
Ozzie PHP

Ozzie PHP

14/11/2013 00:16:35
Quote Anchor link
>> PHP heeft standaard geen functie hiervoor, je kan de functies isset en array_key_exists gebruiken om te controleren of een key bestaat in een array. Deze functies halen de value echter niet op omdat in strijd zou zijn met het doel van de functie zelf.

Snap ik, maar het is wel jammer dat je dit niet gelijktijdig kunt doen. Het voelt een beetje zo:

- Jantje wil met Pietje gaan spelen.
- Jantje belt aan bij Pietje. Moeder doet open. "Is Pietje thuis?" vraagt Jantje. "Ja" zegt de moeder.
- De moeder doet de deur weer dicht.
- Jantje belt weer aan. "Ik kom Pietje halen om buiten te spelen" zegt hij tegen de moeder.
- Pietje komt de trap af lopen en samen gaan ze gezellig buiten spelen.

Liever had ik dit:

- Jantje belt aan.
- De deur gaat open. "Pietje ben je daar? Kom je buiten spelen" roept hij.
- Pietje is blijkbaar thuis en komt direct de trap af lopen om buiten te gaan spelen.

>> Heb het even opgezocht maar inderdaad, normaal doorgeven is beter. De functie past namelijk de array niet aan.

Mijn idee ;)
 
Kris Peeters

Kris Peeters

14/11/2013 10:44:21
Quote Anchor link
Mooie gelegenheid om me wat onpopulair te maken :)

Zet de error display voor notices uit.
kous af.


Ten eerste, een notice is geen fout; een notice is een opmerking.
Elke keer php een notice geeft, denk ik: "dank je wel, maar dit hoefde ik niet te weten".

Wanneer je een isset enkel maar gebruikt om notices te vermijden, verander je niets what so ever aan de werking van de code.

Nog eens herhalen: elke isset die jij gebruikt, en waarvan je vraagt: "waarom eigenlijk?" (de isset's waar jouw post over gaat), zou je kunnen weglaten; het zou geen millimeter veranderen aan de logica van je script; het zou niets veranderen aan het resultaat.


Het is trouwens niet wat ik zelf doe. Ik blijf braafjes isset's gebruiken, maar in mijn achterhoofd is het toch meestal met wat tegenzin.
 
Ozzie PHP

Ozzie PHP

14/11/2013 12:04:44
Quote Anchor link
>> Het is trouwens niet wat ik zelf doe. Ik blijf braafjes isset's gebruiken, maar in mijn achterhoofd is het toch meestal met wat tegenzin.

Haha, reclame maken voor iets wat je zelf niet gebruikt ;)
 
Kris Peeters

Kris Peeters

14/11/2013 12:08:26
Quote Anchor link
Hypocrisie is een ding dat mij niet volledig vreemd is.


Maar geef zelf eens toe. Diep in je hart denk je het zelfde als ik.
De vraag die je stelt is: "Hoe vermijd ik notice's; het lijkt me dat die nutteloos zijn?"
... "waarom zou ik ze niet gewoon uit zetten?"
Gewijzigd op 14/11/2013 12:09:15 door Kris Peeters
 
- SanThe -

- SanThe -

14/11/2013 12:12:03
Quote Anchor link
Kris Peeters op 14/11/2013 12:08:26:
... "waarom zou ik ze niet gewoon uit zetten?"


Dan gebruik ik eerder nog het @-je om dat te vermijden. Je weet dan zelf ook bewust waar en waarom je het doet.
 
Ozzie PHP

Ozzie PHP

14/11/2013 12:19:58
Quote Anchor link
Ik zou dan ook inderdaad liever de @ gebruiken.

Maar ja... het blijft een beetje een vieze nasmaak hebben om fouten (notices) te gaan onderdrukken. Er gaat iets mis, maar we doen net alsof we het niet zien...
 
Kris Peeters

Kris Peeters

14/11/2013 13:24:13
Quote Anchor link
Waarschijnlijk is het dan best om die @ te gebruiken.

(ik ben hier niet speciaal om een conclusie te geven; gewoon even sceptisch kijken naar de dogma's; wat tegen virtuele schenen schoppen en eventueel een discussie laten starten alwaar nog iets interessants uit voort komt)

---
Ik wil hier toch even op door gaan.
Af en toe snap ik de notice die php me geeft.

bv. zomaar dit schrijven, zonder ergens een controle:
$_GET['teller']++;


Maar twee scenario's. Mijn vraag aan php is: 'Waarom geef je hier notice's?'
1)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($_GET['id'] > 5) {
  ...
}

?>


Als $_GET['id'] niet bestaat, is $_GET['id'] zeker niet groter dan 5. Dus kan de if simpelweg een false geven.
Waarom php de drang voelt om mij expliciet te vertellen "okay, We doen het wel; if geeft een false terug, precies zoals je vraagt... maar merk toch op dat $_GET['id'] niet bestaat".
Wat kan mij het schelen of $_GET['id'] bestaat? Ik wil gewoon weten of $_GET['id'] groter is dan 5; in elk ander geval moet de block code niet worden betreden.

2)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
echo verdubbel($_GET['id']);

function
verdubbel($getal) {
  if (!isset($getal)) {
    $getal = 0;
  }

  return 2 * intval($getal);
}

?>


Ik maak dus functies waarbij ik check op isset. Het hele punt aan een functie is dat je daar zo veel mogelijk regelt, zodat je zo weinig mogelijk moet regelen buiten de functie.
Toch voelt php de onweerstaanbare drang om me te vertellen: "Merk op dat $_GET['id'] niet bestaat" (op lijn 1).
Stel nu dat dit een soort filter-functie is, voor $_POST gegevens. Je roept de functie 20 keer op. En alle 20 keer moet je isset gebruiken vooraleer je een variabele in de parameter steekt.
Goed wetende dat de functie dit voor jou doet.
Gewijzigd op 14/11/2013 13:33:26 door Kris Peeters
 
Ozzie PHP

Ozzie PHP

14/11/2013 13:32:48
Quote Anchor link
Ergens is het natuurlijk wel heel begrijpelijk, en ook goed, dat php dit meldt.

"Hé Kris, ik weet niet wat je precies wil doen... maar je bent nu aan het kijken of een variabele groter is dan 5 terwijl die variabele helemaal niet bestaat!"

Nu is dit een onschuldig voorbeeld, maar het is toch prettig als jij bijv. ergens in je code gaat controlen of iemand "authorized" is, en je maakt per ongeluk een spelfout... if ($authorised)... dat php je dan even meldt dat je iets niet goed doet.

Dus nee, het is zeker geen overbodige luxe. Alleen ik zou het wel handig vinden dat je een array-key, als die bestaat, meteen kunt ophalen ipv dat je 2e dezelfde key moet aanspreken. En als ie niet bestaat dat de waarde van de variabele dan gewoon null of false is.
 
Willem vp

Willem vp

14/11/2013 13:57:15
Quote Anchor link
Nog een reden om Perl te gaan gebruiken in plaats van PHP. ;-) Daar kun je namelijk constructies toepassen als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$foo ||= $array[$x];
$dbh ||= new mysqli(...);

Ik heb lang zitten zoeken naar dergelijke shortcuts in PHP, maar heb ze niet gevonden. ;-(

[heel veel later]
Oeps, de code hierboven is een andere constructie dan waarover het in deze discussie gaat. Ik bedoelde natuurlijk:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$foo = $array[$x] || $defaultfoo;

Maar ook dat kan niet in PHP... ;-)
Gewijzigd op 14/11/2013 18:45:26 door Willem vp
 
Kris Peeters

Kris Peeters

14/11/2013 14:02:09
Quote Anchor link
Wel ja, precies.
Javascript doet dat ook. Geen gezever, geen notice ...

var getal = (a * 2.5) || 10;

Als javascript vindt dat (a * 2.5) geen getal is, en dus een NaN teruggeeft, krijgt getal de waarde 10.

Ozzie PHP op 14/11/2013 13:32:48:
... en je maakt per ongeluk een spelfout... if ($authorised)... dat php je dan even meldt dat je iets niet goed doet. ...


Ik weet niet of ik dit een goed argument kan vinden.
Trouwens, dit is niet waar jouw vraag over gaat. Bij het stellen van jouw vraag ging je er niet van uit dat je $array['foo'] verkeerd zou copy/pasten.

Trouwens, die spelfouten zou een IDE direct detecteren. Daar heb je geen runtime errors van php voor nodig
Gewijzigd op 14/11/2013 14:55:34 door Kris Peeters
 
Ozzie PHP

Ozzie PHP

14/11/2013 15:15:29
Quote Anchor link
>> Trouwens, dit is niet waar jouw vraag over gaat. Bij het stellen van jouw vraag ging je er niet van uit dat je $array['foo'] verkeerd zou copy/pasten.

Nee, dat klopt... was ook maar een voorbeeld. Laat ik het dan anders zeggen, je roept iets aan. Als datgene wat je aanroept niet bestaat, dan is het opzich wel logisch dat je daar een opmerking over krijgt. Ik vind het alleen vervelend dat je op het moment dat het wel bestaat, je niet gelijk de waarde kunt opvragen.
 

Pagina: 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.