login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Probleem met array

Offline advertentiep - 23/03/2016 22:51 (laatste wijziging 23/03/2016 23:11)
Avatar van advertentiepPHP interesse
  1. if (array_key_exists($aError[0]))
  2. {
  3. for ($i = 0; $i < $aError[$i]; $i++)
  4. {
  5. echo (count($aError) > 0) ? 'De volgende fouten hebben zich voorgedaan.<br /><br />' : 'De volgende fout heeft zich voorgedaan: <br /><br />';
  6. echo 'Fout:' . $i++ . ' ($i (-1) == count($aError)) ? $aError[$i] '<br />' : 'Fout:' . $i++ . ' ($i (-1) == count($aError)) ? $aError[$i] '<br /><br />'
  7. }
  8.  
  9. }


In het stuk script boven deze snippet heb ik een array $aError aangemaakt, mocht er een fout zijn zet ik deze weg in de array.

De code hierboven gaat uiteraard over het uitspugen van de foutmelding(en).

dmv array_key_exists kijk ik of er uberhaubt een error is, als dit het geval is wil ik het netjes weergeven.

Deze controle voer ik zoals eerder gezegd voor de netheid uit, ik wil rekening houden met enkelfout ($aError[0]) of meerfout ($aError[meer dan 1]
Dus als de melding de laatste fout is 2 br ipv 1.

Ik weet dat een error op 0 begint, dit is lastig in de vergelijking daarom ++ en --, ik wil namelijk niet: fout 0, dit moet gewoon bij 1 beginnen.

Boven aan de pagina zet ik de array(); al klaar mijn vraag is dan ook: bestaat $aError[0] dan ook meteen ?

Ik heb de code zo uitgezet om jullie eerst mee te laten kijken. Het werken met () ? <true> : <false> is nieuw voor mij, dus ik heb vandaag al best wel wat geleerd.

EDIT: ik zie dat er een variable in de quotes staat, het gaat echter om de werking. gewijzigd in me editor.

verbeterde code (denk ik):
  1. if (array_key_exists($aError[0]))
  2. {
  3. for ($i = 0; $i < $aError[$i]; $i++)
  4. {
  5. echo (count($aError) > 0) ? 'De volgende fouten hebben zich voorgedaan.<br /><br />' : 'De volgende fout heeft zich voorgedaan: <br /><br />';
  6. echo 'Fout:' . $i++ ($i (-1) == count($aError)) ? $aError[$i] . '<br />' : 'Fout:' . $i++ . ($i (-1) == count($aError)) ? $aError[$i] '<br /><br />';
  7. }
  8.  
  9. }

4 antwoorden

Gesponsorde links
Offline Thomas - 23/03/2016 23:45
Avatar van Thomas Moderator De constructie ziet er niet helemaal fantastisch uit.

Wat voor speciale betekenis heeft het eerste element van $aError?

Ik zou de variabele trouwens op zijn minst $aErrors noemen.

En dan controleren of $aErrors niet leeg is:
  1. <?php
  2. if (count($aErrors) > 0) {
  3. // ... do stuff ...
  4. }
  5. ?>

Vervolgens: waarom wil je telkens aan deze index refereren, je kunt ook gewoon alle elementen van een array aflopen zonder de index in beschouwing te nemen middels een foreach:
  1. <?php
  2. foreach ($aErrors as $error) {
  3. // ... do stuff ...
  4. }
  5. ?>

Is dit voor terugkoppeling van de validatie van formuliergegevens? Als je dan toch de index mee wilt nemen, voeg hier dan betekenis aan toe, bijvoorbeeld door wat meer structuur aan te brengen in het array, waarbij je de fouten per formulierveld opsomt, zoiets dus:
  1. (
  2. [naam] => Array
  3. (
  4. [0] => het veld mag niet leeg zijn
  5. [1] => een naam mag enkel bestaan uit alfanumerieke karakters
  6. [2] => een naam bestaat minimaal uit X karakters
  7. )
  8. )

Hier kun je dan als volgt doorheen:
  1. <?php
  2. foreach ($aArray as $fieldName => $errors) {
  3. // doe iets met $fieldName als je dat leuk vindt
  4. foreach ($errors as $error) {
  5. // druk $error af
  6. }
  7. }
  8. ?>

Dan staat de "de volgende fouten hebben zich voorgedaan" binnen de for-loop, dus die mededeling wordt vaker afgedrukt. Deze zou binnen het count-if-statement moeten staan, en buiten de lus. Ook is het een goede gewoonte om zo weinig mogelijk dubbel te doen. Een wellicht betere variant is dan dus ook:
  1. <?php
  2. if (count($aErrors) > 0) {
  3. ?>De volgende fout<?php echo (count($aErrors) == 1 ? ' heeft' : 'en hebben') ?> zich voorgedaan:<br /><br /><?php
  4. // doe iets met $aErrors
  5. }
  6. ?>

Uiteraard, als je de fouten verder opdeelt in subarrays zul je iets anders moeten verzinnen. Je kunt er natuurlijk ook altijd voor kiezen om altijd meervoud te gebruiken, en bovenstaande spagaat tussen enkelvoud en meervoud daarmee uit de weg gaat.

Als je een teller wilt afdrukken die 1 hoger is dan zijn index, gebruik dan gewoon:
  1. <?php
  2. echo ($i + 1);
  3. ?>

Maar NIET
  1. <?php
  2. echo $i++;
  3. ?>

Want dit doet twee dingen verkeerd:
- de waarde wordt eerst afgedrukt en dan pas opgehoogd
- de waarde wordt opgehoogd, dit is ook niet goed omdat dat je for-loop door de waar stuurt

Indien je een foreach loop gebruikt laat je gewoon een tellertje meelopen die bij 1 begint. Maar waarom zou je dit doen? Een nummer toekennen aan een fout is nogal loos omdat dit nummer toch altijd anders is of kan zijn. Daarnaast lijkt het mij relevanter om aan te geven bij welk invoerveld er iets fout gaat, niet dat dit fout nummer 43 is.

Je zou ook kunnen overwegen om van een bulleted list gebruik te maken, dan hoef je ook niet overal linebreaks tussen te kwakken.
Offline advertentiep - 24/03/2016 00:10
Avatar van advertentiep PHP interesse Wederom bedankt Thomas.

Je eerst code waar jij count(); gebruikt en ik controller of er meer dan de index is is omdat ik het script begin met de array $aErrors te 'zetten' ik wist niet of er dan meteen een key (0) aan wordt toegewezen, ik zal het met count doen.

Ik geef de key's geen naam of nummer omdat ik de controle simpel wil houden en de code wat compacter te houden (dit is niet voor bezoekers dus hoeft niet te gedetaileerd):
als IsSet(var) en strlen(tekstvel) > 3 dan OK anders foutmelding "Veld is leeg of te kort".

De reden dat ik de array_key af wil drukken is inderdaad om de fouten op te sommen:
key + 1 : 1e fout: <melding>.

De reden dat ik de andere statement uitvoer (als $i (key) gelijk is aan de laate foutmelding heeft te maken met een dubble breaking rule.

1e fout BR
2e laaste fout BR BR
button

Ik heb je $i++ veranderd naar $i + 1, ik wist niet dat er eerst geparst werdt maar best logisch.

Nu ik dit zo beschreven heb kan ik dan me eigen methode aanhouden ?
Offline Thomas - 24/03/2016 02:17
Avatar van Thomas Moderator Ik denk van wel? Als alles correct wordt weergegeven wanneer je een lijstje met meerdere fouten afdrukt zie ik niet waarom niet?
Offline advertentiep - 24/03/2016 12:46 (laatste wijziging 24/03/2016 12:48)
Avatar van advertentiep PHP interesse
Resultaat: DB is aangemaakt, klik op de onderstaande knop om door te gaan.
Alle velden zijn leeg...?

$_SERVER['PHP_SELF'] hier gebruikte ik vroeger een andere variant voor in het <form> enig idee ?

Plaatscode: 142493

edit: ook als ik $aError[] gebruik dan werkt het niet.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.28s