Toelichting code gevraagd array's i.c.m.foreach loops

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Bas van de Ven

Bas van de Ven

03/08/2015 21:57:53
Quote Anchor link
Onderstaande code heb ik op internet gevonden en werkt voor mij doeltreffend om meerdere records te wijzigen of in te voeren met 1 submit. De submit knop heet knpInsert_ en elk veldnaam eindigt op _$Id. $Id is het sleutelveld uit de tabel en maakt elk veld op het formulier uniek.
Nu wil ik onderstaande code aanpassen om weer een doel te bewerkstelligen. Door fouten die ontstaan wil ik snappen wat de code doet. Per regel heb ik beschreven wat de regel doet.

Op 3 plaatsen kom ik er niet uit kan iemand mij uitleggen wat de code doet of waarom het stukje code daar noodzakelijk is.

Het gaat om :

1. de variabele $vreemd :
Vreemd is dat de naam van de variabele nergens meer wordt toegepast. Waar heeft de variabele $vreemd betrekking op ? Het kan nl. niet worden verwijderd.

2. Wat betekent = $fldvalue achter de variabele $multip_array[ ? Is dat de waarde die aan de twee indexen hangt ?

3. Met de eerste foreach($id as $key => $value) wordt een array doorlopen waarin resp. de veldnaam en waarde wordt teruggegeven.
Waarom moet een voorwaarde volgen met verwijzing naar een willekeurig veldnaam van het formulier incl. de foreach loop die hierna volgt ?
Heeft dat te maken met het feit dat knpInsert_ niet in de loop van records zit en alle andere velden op het formulier wel ?

Ik hoop dat de code jullie voldoende zegt het wordt nl. geïnclude in diverse formulieren waarbij wijzigingen over meerdere records in 1 keer wordt opgeslagen. (geupdate of hier geïnsert). Opbouw van het formulier (html) komt dus niet voor in dit script

<code>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
function getNaamFromKey($string) { // functie om de naam te scheiden uit een string ($string)
    $breek_naam = explode('_', $string); // variabele met daarin stukken string die zijn gescheiden per karakter '_'. De stukken string worden in een array geplaatst.
    return $breek_naam[0];  // Geeft de eerste string uit de array terug
}

function
getIdFromKey($string) { // functie om het Id te scheiden uit een string ($string)
    $breek_Id = explode('_', $string); // variabele met daarin stukken string die zijn gescheiden per karakter '_'. De stukken string worden in een array geplaatst.
    return $breek_Id[1]; // Geeft de tweede string uit de array terug
}

$vreemd = array();  // Variabele die een array aanlegd.  Vreemd is dat de naam van de variabele nergens meer wordt toegepast. Waar dit direct op betrekking heeft weet ik niet, het kan i.i.g. niet worden verwijderd !

foreach($_POST as $fldname => $fldvalue) {  //  Voor elke post die wordt doorlopen wordt de veldnaam en de waarde teruggeven als een array
    echo $fldname.'='.$fldvalue.' '."<br/>";
    $multip_array[getIdFromKey($fldname)][getNaamFromKey($fldname)] = $fldvalue;  // Opbouwen van een Multidimensional array met 2 indexen. [Id] [naamveld] en een waarde nl. de veldwaarde.

}
echo "<br/>";

foreach($multip_array as $id) {  // Doorloopt de Multidimensional array en geeft de inhoud (een array) terug. De eerste van de twee indexen wordt doorlopen nl. het Id van een record. Het resultaat kan niet worden geëchod hooguit print_r. Hiermee zie je hoe de array is opgebouwd. print_r($id)."<br/>"."<br/>";
echo "<br/>";
 foreach($id as $key => $value) { //Doorlopen van de array met de tweede index nl. de veldnaam en geeft de naam (als index) en waarde van het veld terug
 echo $key.'='.$value.' '."<br/>";  // Per id krijg je nu alle veldennamen met hun waarde terug.


 if ($key == 'txtId' )     { ?>
Vraag uit beschrijving : Waarom deze voorwaarde met verwijzing naar een willekeurig veldnaam van het formulier incl. de foreach loop die hierna volgt ?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
    
  foreach($id as $key => $value) {
   echo 'als ...'.$key."<br/>";
    if ($key == 'txtId' ) { $updId = $value; }    

    if ($key == 'txtgebdm' ) { $dag = date_create($value); $flddag =  date_format($dag, 'Y-m-d');  
                                      }


    if ($key == 'txtlevgeb' && !empty($value)) {  $fldlevnr = $value; }    
     else if ($key == 'txtlevgeb' && empty($value)) {  $fldlevnr = 'NULL' ; }
    
    if ($key == 'kzlras' && !empty($value)) {  $fldras = $value; }
     else if ($key == 'kzlras' && empty($value)) {  $fldras = 'NULL' ; }
    

    
                                    }




// Insert tbl
    $insert_tbl = "INSERT INTO tbl ..... " ;    
        mysqli_query($db,$insert_tbl) or die (mysqli_error($db));    
// Einde Insert tbl
    

                        }
                                        }


                                }

?>

</code>
Gewijzigd op 03/08/2015 22:00:40 door Bas van de Ven
 
PHP hulp

PHP hulp

21/11/2024 21:10:21
 
- SanThe -

- SanThe -

03/08/2015 23:01:12
Quote Anchor link
1. Als $vreemd echt nergens anders meer voorkomt kan je regel 12 toch gewoon verwijderen.
2. $multip_array is een twee dimensionaal array. Met = $fldvalue wordt die waarde in het array gestopt op plaats [..][..].
3. Dit begrijp ik niet: Waarom moet een voorwaarde volgen met verwijzing naar een willekeurig veldnaam van het formulier incl. de foreach loop die hierna volgt ?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/08/2015 23:18:32
Quote Anchor link
Het inspringen gaat ook nog niet helemaal lekker waardoor de code erg moeilijk leesbaar is.

Een if() in een foreach() is toch zeker niet ongebruikelijk. Er zijn ontelbare voorbeelden te bedenken.


Toevoeging op 03/08/2015 23:24:11:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php

$aantal
= 0;
$kleuren = array('groen', 'rood', 'rood', 'groen', 'rood');

foreach($kleuren as $kleur)
{

    if($kleur == 'rood')
        $aantal++;
}


echo 'Er zijn ' . $aantal . ' elementen "rood"';
 
Bas van de Ven

Bas van de Ven

04/08/2015 23:16:42
Quote Anchor link
Misschien nog even uitleg formulier opbouw.
Als voorbeeld : Een query geeft 3 records terug en per record 5 velden.
Elke veld op het formulier heeft zijn eigen naam bijv. txtId, txtDatum, txtNummer, txtNaam en txtReden. Er zijn dus 15 velden. 3x txtId, 3x txtDatum, 3x txtNummer enz.
Alle 15 velden moeten met 1 submit(knop) worden opgeslagen in de database. Hier de knop knpInsert_
Om elk veld uniek te maken is de naam resp. txtId_$Id, txtDatum_$Id, txtNummer_$Id, txtNaam_$Id en txtReden_$Id.
De code in deze topic genereert een multidimensional array met twee indexen die vervolgens wordt doorlopen.

Op regel 21 wordt multidimensional array doorlopen o.b.v. de eerste index. (Record ID)
Op regel 23 wordt multidimensional array doorlopen o.b.v. de tweede index. (Gegevens per record)

Regel 27 (eerste script) en regel 3 (tweede script) hierboven heb ik niet nodig om dit resultaat te krijgen.

loop Id knpInsert=Inlezen
loop record
loop Id txtId=2025
loop record txtDatum=05-06-2015
loop record txtNummer=100115549500
loop record txtNaam=Merel
loop record txtReden= Foto
loop record
loop Id txtId=2026
loop record txtDatum=11-06-2015
loop record txtNummer=100115649499
loop record txtNaam=Koolmees
loop record txtReden= video opname
loop record
loop Id txtId=2027
loop record txtDatum=11-06-2015
loop record txtNummer=100115449495
loop record txtNaam=Mus
loop record txtReden= n.v.t.
loop record

Zoals je ziet heb ik regel 27 en regel 3 hierboven weggehaald in de code hieronder.
Als ik de waarde van de array ($value uit regel 24) in een variabele stop gaat het fout bij echoën.
Na de eerste loop Id (knpInsert=Inlezen dus) bestaat $updId en $fldNummer uit regel 44 en 45 hieronder nl. nog niet.
Hoe kan ik dat omzeilen ? Ps. Dit issue heeft betrekking op punt 3 uit mijn bericht hierboven.
D.m.v. een extra foreach loop met een willekeurig veldnaam ?

<code>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
function getNaamFromKey($string) { // functie om de naam te scheiden uit een string ($string)
    $breek_naam = explode('_', $string); // variabele met daarin stukken string die zijn gescheiden per karakter '_'. De stukken string worden in een array geplaatst.
    return $breek_naam[0];  // Geeft de eerste string uit de array terug
}

function
getIdFromKey($string) { // functie om het Id te scheiden uit een string ($string)
    $breek_Id = explode('_', $string); // variabele met daarin stukken string die zijn gescheiden per karakter '_'. De stukken string worden in een array geplaatst.
    return $breek_Id[1]; // Geeft de tweede string uit de array terug
}

foreach($_POST as $fldname => $fldvalue) {  //  Voor elke post die wordt doorlopen wordt de veldnaam en de waarde teruggeven als een array
   // echo $fldname.'='.$fldvalue.' '."<br/>";

    $multip_array[getIdFromKey($fldname)][getNaamFromKey($fldname)] = $fldvalue;  // Opbouwen van een Multidimensional array met 2 indexen. [Id] [naamveld] en een waarde nl. de veldwaarde.

}
echo "<br/>";

foreach($multip_array as $id) {  // Doorloopt de Multidimensional array en geeft de inhoud (een array) terug. De eerste van de twee indexen wordt doorlopen nl. het Id van een record. Het resultaat kan niet worden geëchod hooguit print_r. Hiermee zie je hoe de array is opgebouwd. print_r($id)."<br/>"."<br/>";

echo "<br/>". "loop Id &nbsp&nbsp";
 foreach($id as $key => $value) { //Doorlopen van de array met de tweede index nl. de veldnaam en geeft de naam (als index) en waarde van het veld terug
 echo "loop record &nbsp&nbsp&nbsp";    
 echo $key.'='.$value.' '."<br/>";  // Per id krijg je nu alle veldennamen met hun waarde terug.





         if ($key == 'txtId' ) { $updId = $value; /*echo $key.'='.$value."<br/>";*/}    

    if ($key == 'txtDatum' ) { $dag = date_create($value); $flddag =  date_format($dag, 'Y-m-d');
                                      }


    if ($key == 'txtNummer' && !empty($value)) {  $fldNummer = $value; }    
     else if ($key == 'txtNummer' && empty($value)) {  $fldNummer = 'NULL' ; }
    
    if ($key == 'txtNaam' && !empty($value)) {  $fldNaam = $value; }
     else if ($key == 'txtNaam' && empty($value)) {  $fldNaam = 'NULL' ; }
    
    if ($key == 'txtReden' && !empty($value)) {  $fldReden = $value; }
     else if ($key == 'txtReden' && empty($value)) {  $fldReden = 'NULL' ; }
                                    
echo $updId."<br/>";
echo $fldNummer."<br/>";
?>

</code>
Gewijzigd op 05/08/2015 11:02:37 door Bas van de Ven
 
Bas van de Ven

Bas van de Ven

06/08/2015 00:38:51
Quote Anchor link
Ik ben eruit. Met de voorwaarde
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php if ($key == 'txtId' ) { ?>
incl. opnieuw doorlopen van de array met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php foreach($id as $key => $value) { ?>
omzeil je de lege array uit regel 22. Bij het passeren van knpInsert in regel 19 wordt een lege array teruggegeven in $id. Deze wil je in regel 22 uitsluiten.

Het is lastig uitleggen maar als er geïnteresseerden zijn kan ik een poging wagen met meer woorden.
 



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.