Radeloze php foreach probleem

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
helmuteke
Premium Member
Premium Member
Berichten: 568
Lid geworden op: 08 feb 2010, 15:36
Uitgedeelde bedankjes: 3 keer
Bedankt: 27 keer

zit nu al 2 dagen mijn tanden stuk te bijten op onderstaande

ik heb volgende array

Code: Selecteer alles

print "<pre>";
print_r($aantal);
print "</pre>";

Array
(
    [5048132097-1537439059] => Array
        (
            [ COTM ] => Array
                (
                    [tijdstip] => 20:30
                    [0] => Array
                        (
                            [traiteur] =>  COTM 
                            [aantal] => 10
                            [naam] =>  Menu 
                            [type] => 
                            [wie] =>  Residentie
                            [datum] => 03/09/2018
                        )

                    [1] => Array
                        (
                            [traiteur] =>  COTM 
                            [aantal] => 1
                            [naam] =>  Menu 
                            [type] => 
                            [wie] =>  Extern
                            [datum] => 03/09/2018
                        )

                    [2] => Array
                        (
                            [traiteur] =>  COTM 
                            [aantal] => 1
                            [naam] =>  Menu 
                            [type] =>  V 
                            [wie] =>  Andere 
                            [datum] => 03/09/2018
                        )

                    [3] => Array
					
				enz . . . .


ik doe onderstaande for each loops

Code: Selecteer alles


foreach($aantal as $trat1)
				{
			
				foreach($trat1 as $trat2)
					{
						print $trat2['tijdstip'] . "<BR>";
						
						foreach($trat2 as $trat3)
						
						{
							print $trat3['wie'] . " -" . $trat3['aantal']  . "<BR>";
						}
						
					}
					
					
					
				}

en krijg volgend resultaat

Code: Selecteer alles

20:30
2 -2
Residentie -10
Extern -1 
Het probleem zit hem bij de 2 - 2 , van waar in hemelsnaam haalt hij dit ??? bij verdere output van array heb ik dit ook.
Het is telkens de eerste character van de value erboven

Iemand een idee ??
Gebruikersavatar
Splitter
Elite Poster
Elite Poster
Berichten: 5230
Lid geworden op: 10 maa 2010, 12:30
Uitgedeelde bedankjes: 64 keer
Bedankt: 520 keer
Recent bedankt: 9 keer

heb niet echt superveel tijd maar je loop is toch absurd als ik vlug erover ga?
key value paar zou logischer zijn denk ik, of op zijn minst snap ik niet waarom je elke keer een nieuwe waarde aan dezelfde array geeft?


zoiets (let op, wss totaal geen werkende code, je moet ff het aanpassen en ik ga geen garanties geven op 2 seconde code zonder je array echt te bekijken)

Code: Selecteer alles

foreach($aantal as $key -> $value)
            {
         
           print $key['tijdstip'] . "<BR>";
                  $keyprint $trat3['tijdstip']['wie'] . " -" . $trat3['tijdstip']['aantal']  . "<BR>";
                  }
als je me in pm een keer de pure array (zoals die aan je script geleverd is)


vlugge edit: probeer deze foreach een keer en laat me ff weten wat die geeft:

Code: Selecteer alles

foreach($aantal as $list => $item)            {     
print $item['tijdstip'] . "<BR>";    
            foreach($item as $key => $value)
               {
                     print $value['wie'] . " -" . $value['aantal']  . "<BR>";
               }
           }
(also, je array kan zowiezo mooier en dan heb je dit soort zoekwerk niet)
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16726
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 573 keer
Bedankt: 770 keer

Die array $aantal is vreselijk.
Aangezien je geen serialized string hier meegaf zelf gemaakt:

Code: Selecteer alles

$aantal['5048132097-1537439059']['COTM'] = [
    'tijdstip' => '20:30',
    [
        'traiteur' => 'COTM',
        'aantal' => 10,
        'naam' => 'menu',
        'type' => '',
        'wie' => 'residentie',
        'datum' => '03/09/2018'
    ],
    [
        'traiteur' => 'COTM',
        'aantal' => 1,
        'naam' => 'Menu',
        'type' => 'V',
        'wie' => 'Andere',
        'datum' => '03/09/2018'
    ]
]; 
Je ziet hier misschien beter dat je "tijdstip" en dan die entries vanaf 0 zich allemaal ophetzelfde niveau bevinden. Je loopt met andere woorden over verschillende datatypen heen (key/value-paar 'tijdstip', daarna indexed arrays), maar in je loop benader je alles op dezelfde manier en krijg je deze fout:

Code: Selecteer alles

Array
(
    [5048132097-1537439059] => Array
        (
            [COTM] => Array
                (
                    [tijdstip] => 20:30
                    [0] => Array
                        (
                            [traiteur] => COTM
                            [aantal] => 10
                            [naam] => menu
                            [type] =>
                            [wie] => residentie
                            [datum] => 03/09/2018
                        )

                    [1] => Array
                        (
                            [traiteur] => COTM
                            [aantal] => 1
                            [naam] => Menu
                            [type] => V
                            [wie] => Andere
                            [datum] => 03/09/2018
                        )

                )

        )

)
20:30
PHP Warning:  Illegal string offset 'wie' in C:\Temp\array-ub.php on line 29

Warning: Illegal string offset 'wie' in C:\Temp\array-ub.php on line 29
PHP Warning:  Illegal string offset 'aantal' in C:\Temp\array-ub.php on line 29

Warning: Illegal string offset 'aantal' in C:\Temp\array-ub.php on line 29
2 - 2
residentie - 10
Andere - 1
Je kan niet via loops zomaar door zo'n array navigeren, want da's net het punt van een loop: dat alles zich op dezelfde manier gedraagt.

Dat jij die warnings niet ziet (had je wellicht wat hersenbrekers bespaard) is omdat mogelijk deze door je php.ini onderdrukt worden. Ik heb mijn code gewoon in de console uitgevoerd via PHP 7.2.9.

Indien je geen controle hebt over array $aantal kan je denk ik het beste dit doen:

Code: Selecteer alles

echo $aantal['5048132097-1537439059']['COTM']['tijdstip'] . PHP_EOL;
foreach ($aantal['5048132097-1537439059']['COTM'] as $item) {
    if (is_array($item)) {
        echo $item['wie'] . " - " . $item['aantal'] . PHP_EOL;
    }
} 
Resulteert in:

Code: Selecteer alles

20:30
residentie - 10
Andere - 1
Gebruikersavatar
Splitter
Elite Poster
Elite Poster
Berichten: 5230
Lid geworden op: 10 maa 2010, 12:30
Uitgedeelde bedankjes: 64 keer
Bedankt: 520 keer
Recent bedankt: 9 keer

@meon: had quasi hetzelfde idd al in een priveberichtje aan de OP gegeven :)
(maar ook aangeraden van idd de arrays properder te maken)

php debugging output had ik zelf wel niet aan gedacht... is ook weer waar dat dat bestaat :D
(als het nog werkt(?) is idd in je code tijdens dev even bovenaan error_reporting(E_ALL) bij zetten)
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16726
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 573 keer
Bedankt: 770 keer

Stom dat er discussie via PM liep, dan had ik me wellicht wat moeite kunnen besparen.

Pro-tip: Als je helemaal wilt kunnen steppen door je loops kan je Xdebug gebruiken via Visual Studio Code (=open source en gratis).
Je zet dan een breakpoint ergens in je code (bvb op de echo) en dan stopt de uitvoer op dat punt en kan je console-gewijs de inhoud van variabelen op dat moment opvragen.
Afbeelding
https://marketplace.visualstudio.com/it ... .php-debug
Plaats reactie

Terug naar “Development”