isset en waarde direct binnenhalen
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:
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.
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
@pipo: ik denk dat je mijn vraag niet begrijpt.
Blijft wel twee keer $array gebruiken..
Maar je, het zit er helaas niet in ben ik bang :)
Je kan het altijd nog op de zeer foute manier doen:
Je weet dan alleen nooit echt wat er in zit.
Gewijzigd op 13/11/2013 21:07:41 door - SanThe -
Mja... ook niet echt de manier, haha...
(Waarom geef je de array by reference door?)
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:
Heb het even opgezocht maar inderdaad, normaal doorgeven is beter. De functie past namelijk de array niet aan.(Waarom geef je de array by reference door?)
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 ;)
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.
Haha, reclame maken voor iets wat je zelf niet gebruikt ;)
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
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.
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...
(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)
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)
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
"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.
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:
Maar ook dat kan niet in PHP... ;-)
Gewijzigd op 14/11/2013 18:45:26 door Willem vp
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
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.