Allereerst, fijne kerst nog ff!

Ik heb een probleem geminimaliseerd tot het volgende stukje code.

<?php
$item = array();
$item[] = array("HL","03-09-2016","http://www.loopcircuitdewolden.nl/","; ","Dijkhuizenrun");
$item[] = array("HL","03-09-2016","http://www.avaquilo.nl","; ","Jaarmarktloop");

$event = array();
for($i=0;$i<sizeof($item);$i++):
$event[$item[$i][1]][] = array($item[$i][0],$item[$i][2],$item[$i][4]);
endfor;

print @$event["03-09-2016"][0][2]; //prints Dijkhuizenrun

function blabla()
{
return @$event["03-09-2016"][0][2]; //can't find entry
}

print blabla(); //so.. prints nothing
?>

Wat zie ik over het hoofd?

Groet,
Simon
Je ziet de scoping over het hoofd. Je kunt global $event gebruiken in je functie, maar het is netter op $event bijvoorbeeld mee te geven aan de functie.
Als je die vreselijke @ niet gebruikt zie je ook duidelijk een melding over een undefined variable.
Ik zit nog steeds met hetzelfde probleem, misschien weet ik niet goed wat je bedoelt met scoping.
Zo?:
<?
function blabla()
{
global $a;
$a = @$event["03-09-2016"][0][2];
return $a;
}
?>
Want ook dat werkt niet (ik neem aan dat ik het niet goed doe).

- Wat betreft de datum meegeven aan de functie, dat gaat niet:
De originele functie print een kalendermaand in een tabel. Met een for-loop voor bijv. 2016 voert hij deze functie 12x uit in de vorm van create_calender(12,2016). Bij iedere dag (bijv. 03-09-2016) wil ik checken of er een evenement is gepland die dag. Maar hij kan het niet lezen. Het probleem zit hem ergens in het bovenstaande voorbeeld. Ik kan het hele geval posten, maar weet niet of je daar meer mee kunt.

- Wat betreft je opmerking over die @: ik zal er iets anders op verzinnen. Maar dat heeft geen effect op de uitvoer (helaas geen melding over lege variabelen in het complete script). En ik heb met opzet ook buiten de functie dezelfde opdracht staan waar die wel werkt.

Bedankt voor je reactie en het meedenken.

[size=xsmall]Toevoeging op 26/12/2015 23:16:33:[/size]


<html>
<head>
<style>
/* calendar */
table.calendar		{ border-left:1px solid #999; }
tr.calendar-row		{  }
td.calendar-day		{ min-height:160px; font-size:10px; position:relative; } * html div.calendar-day { height:160px; }
td.calendar-day:hover	{ background:#ece5ff; }
td.calendar-day-np	{ background:#eee; min-height:160px; } * html div.calendar-day-np { height:160px; }
td.calendar-day-head 	{ font-family:verdana; font-size:12px; background:#ccc; font-weight:bold; text-align:center; width:200px; padding:5px; border-bottom:1px solid #999; border-top:1px solid #999; border-right:1px solid #999; }
div.day-number		{ font-family:verdana; font-size:14px; background:#999; padding:5px; color:#fff; font-weight:bold; float:right; margin:-5px -5px 0 0; width:20px; text-align:center; }
/* shared */
td.calendar-day, td.calendar-day-np { width:200px; padding:5px; border-bottom:1px solid #999; border-right:1px solid #999; }
/* month + year */
h2 			{ font-family:verdana; font-size:16px; }
</style>
</head>
<body>
<?php
$item = array();
// $item[] = array("CAT","Datum","Link","","Naam","Vertrekplaats","Afstand","Tijd","Opmerking","Ingeschreven","Staat Datum Vast");
$item[] = array("HL","27-12-2015","http://www.avaquilo.nl/index.php/weg-a-recreatiefalgemeen/w-a-r-artikels/775-oudejaarsloop2015"," ","Valkema Sport Oudejaarsloop","Blijham","HM","","Loopcircuit Schutrups","Ja","Ja");
$item[] = array("HL","02-01-2016","http://www.runnersstadskanaal.nl/index.php?page=691&sid=2"," ","Noorderpoort Nieuwjaarsloop","Stadskanaal","10K","","Loopcircuit Schutrups","Ja","Ja");
$item[] = array("HL","14-02-2016","http://www.groetuitschoorl.nl/algemeen-10-km/"," ","Groet uit Schoorl","Schoorl","10K","","Inschrijven vanaf 24 augustus 2015","","Ja");
$item[] = array("HL","26-03-2016","http://www.loopcircuitdewolden.nl/"," ","Viaductenloop","Zuidwolde","10K","","Loopcircuit De Wolden","","");
$item[] = array("HL","10-04-2016","http://www.nnmarathonrotterdam.nl/"," ","NN Marathon Rotterdam","Rotterdam","M","","","Ja","Ja");
$item[] = array("HL","17-04-2016","http://www.cascaderun.nl/nl/deelnemers-bedrijventeams/individuele-deelnemers/"," ","Cascaderun","Hoogeveen","5EM","","","","Ja");
$item[] = array("HL","05-05-2016","http://www.nachtvangroningen.nl/"," ","Nacht van Groningen","Groningen","10K","","","","");
$item[] = array("HL","07-05-2016","http://www.loopcircuitdewolden.nl/"," ","Crossloop","Zuidwolde","10K","","Loopcircuit De Wolden","","");
$item[] = array("HL","18-05-2016","http://www.acerflanden.nl/erflandenrun/"," ","Erflandenrun","Hoogeveen","10K","","","","");
$item[] = array("HL","22-05-2016","http://www.loopleeuwarden.frl/hardlopen/"," ","Loop van Leeuwarden","Leeuwarden","10K","","Inschrijving geopend","","Ja");
$item[] = array("HL","29-05-2016","www.svveendamatletiek.nl"," ","Valkema Parkstadloop","Veendam","10K","","Loopcircuit Schutrups","Ja","");
$item[] = array("HL","05-06-2016","http://www.loopcircuitdewolden.nl/"," ","Mooi Ruinen Run","Ruinen","10K","","Loopcircuit De Wolden","","");
$item[] = array("HL","08-06-2016","http://www.avaquilo.nl"," ","Oud Alteveerloop","Nieuwe Pekela","10K","","Loopcircuit Schutrups","Ja","");
$item[] = array("HL","12-06-2016","http://run4.educaided.org/"," ","Run4Educaided","Groningen","4EM","","","","Ja");
$item[] = array("HL","19-06-2016","www.svveendamatletiek.nl"," ","Natuurloop Meerwijck","Kropswolde","10K","","Loopcircuit Schutrups","Ja","");
$item[] = array("HL","25-06-2016","http://www.univestadsloop.nl/"," ","Unive Stadsloop","Appingedam","10K","","","","");
$item[] = array("HL","25-06-2016","http://www.runnersstadskanaal.nl"," ","Onstwedderomloop","Onstwedde","10K","","Loopcircuit Schutrups","Ja","");
$item[] = array("HL","10-08-2016","http://www.loopcircuitdewolden.nl/"," ","Alkeloop","Alteveer","10K","","Loopcircuit De Wolden","","");
$item[] = array("HL","20-08-2016","http://www.desnellerakkers.nl/Singelloop/Singelloop.php"," ","Singelloop","Hollandscheveld","10K","","","","");
$item[] = array("HL","25-08-2016","http://www.loopcircuitdewolden.nl/"," ","Wiekloop","De Wijk","10K","","Loopcircuit De Wolden","","");
$item[] = array("HL","03-09-2016","http://www.loopcircuitdewolden.nl/"," ","Dijkhuizenrun","Ruinerwold","10K","","Loopcircuit De Wolden","","");
$item[] = array("HL","03-09-2016","http://www.avaquilo.nl"," ","Jaarmarktloop","Oude Pekela","10K","","Loopcircuit Schutrups","Ja","");
$item[] = array("HL","10-09-2016","http://www.runwinschoten.nl/"," ","Run Winschoten","Winschoten","10K","","","","");
$item[] = array("HL","18-09-2016","http://www.damloop.nl/"," ","Dam tot Damloop","Amsterdam","10EM","","","","Ja");
$item[] = array("HL","25-09-2016","http://www.runnersstadskanaal.nl"," ","Schutrups Run","Exloo","HM","","Loopcircuit Schutrups","Ja","");
$item[] = array("HL","02-10-2016","http://www.loopcircuitdewolden.nl/"," ","Bikkelloop","Zuidwolde","10K","","Loopcircuit De Wolden","","");
$item[] = array("HL","09-10-2016","http://4mijl.nl/"," ","4Mijl van Groningen","Groningen","4EM","","","","Ja");
$item[] = array("HL","23-10-2016","http://zeemijlenloopdelfzijl.nl/"," ","Zeemijlenloop","Delfzijl","6ZM","","","","");
$item[] = array("HL","29-10-2016","http://avdcross.nl/category/nieuws/"," ","Dwingelderveldloop","Dwingeloo","HM","","","","");
$item[] = array("HL","06-11-2016","http://www.runnersstadskanaal.nl"," ","Polderputten Bosloop","Ter Apel","10K","","Loopcircuit Schutrups","Ja","");
$item[] = array("HL","12-11-2016","http://www.avaquilo.nl"," ","Virol Sinterklaasloop","Scheemda","10K","","Loopcircuit Schutrups","Ja","");
$item[] = array("HL","20-11-2016","http://www.zevenheuvelenloop.nl/"," ","Zevenheuvelenloop","Nijmegen","15K","","Inschrijven vanaf 1 juni 2016","","Ja");
$item[] = array("HL","18-12-2016","http://www.avaquilo.nl"," ","Valkema Sport Oudejaarsloop","Blijham","HM","","Loopcircuit Schutrups","Ja","");

	/* rearrange the array to event["Datum"][] = array("0CAT","1Link","2Naam","3Vertrekplaats","4Afstand","5Tijd","6Opmerking","7Ingeschreven","8Staat Datum Vast"); to make it searchable */
	/* second bracket for double events on a date like on the 3rd of sep */

	$event = array();
	for($i=0;$i<sizeof($item);$i++):
		$event[$item[$i][1]][] = array($item[$i][0],$item[$i][2],$item[$i][4],$item[$i][5],$item[$i][6],$item[$i][7],$item[$i][8],$item[$i][9],$item[$i][10]);
	endfor;
$test_1 = '03';
$test_2 = '09';
$test_3 = '2016';
$test_4 = $test_1.'-'.$test_2.'-'.$test_3;
/*************************WERKT PRIMA*********************************/
print '<p>'.@$event[$test_4][0][2].'</p>';

$months = array('Januari','Februari','Maart','April','Mei','Juni','Juli','Augustus','September','Oktober','November','December');
/* draws a calendar */
function draw_calendar($month,$year){

	/* draw table */
	$calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';

	/* table headings */
	$headings = array('Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag');
	$calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';

	/* days and weeks vars now ... */
	$running_day = date('w',mktime(0,0,0,$month,1,$year));
	$days_in_month = date('t',mktime(0,0,0,$month,1,$year));
	$days_in_this_week = 1;
	$day_counter = 0;
	$dates_array = array();

	/* row for week one */
	$calendar.= '<tr class="calendar-row">';

	/* print "blank" days until the first of the current week */
	for($x = 0; $x < $running_day; $x++):
		$calendar.= '<td class="calendar-day-np"> </td>';
		$days_in_this_week++;
	endfor;

	/* keep going with days.... */
	for($list_day = 1; $list_day <= $days_in_month; $list_day++):
		$calendar.= '<td class="calendar-day">';
		
		/* add in the day number */
		$calendar.= '<div class="day-number">'.$list_day.'</div>';

		/* make the date */
		$list_day < 10 ? $dag = '0'.$list_day : $dag = $list_day;
		$month < 10 ? $maand = '0'.$month : $maand = $month;
		$jaar = ''.$year;

		/* list the events (2nd entry in array) with that key */
		$datekey = $dag.'-'.$maand.'-'.$jaar;

		/***************EN HIER ZIT HET PROBLEEM**************/
		$calendar.='<p>'.@$event[$datekey][0][2].'</p>';	
		/*********************DOET NIE***********************/

		$calendar.= '</td>';
		if($running_day == 6):
			$calendar.= '</tr>';
			if(($day_counter+1) != $days_in_month):	
				$calendar.= '<tr class="calendar-row">';
			endif;
			$running_day = -1;
			$days_in_this_week = 0;
		endif;
		$days_in_this_week++; $running_day++; $day_counter++;
	endfor;

	/* finish the rest of the days in the week */
	if($days_in_this_week < 8 && $days_in_this_week > 1):
		for($x = 1; $x <= (8 - $days_in_this_week); $x++):
			$calendar.= '<td class="calendar-day-np"> </td>';
		endfor;
	endif;

	/* final row */
	$calendar.= '</tr>';

	/* end the table */
	$calendar.= '</table>';
	
	/* all done, return result */
	return $calendar;
}

/* well now, we can easily work with request variables: */
/* but let's start with only the last month in 2015 (bc of Schutrups final run) */
for($i=11;$i<12;$i++):
print '<h2>'.$months[$i].' 2015</h2>';
print draw_calendar($i+1,2015);
endfor;

/* and continue with the complete year of 2016 */
for($i=0;$i<12;$i++):
print '<h2>'.$months[$i].' 2016</h2>';
print draw_calendar($i+1,2016);
endfor;
?>
</body>
</html>
<?
function blabla()
{
global $a;
$a = @$event["03-09-2016"][0][2];
return $a;
}
?>

Dat zei ik toch niet? Ik bedoelde
<?
function blabla()
{
global $event;
return $event["03-09-2016"][0][2];
}
?>

Of nog liever
<?
function blabla($event)
{
return $event["03-09-2016"][0][2];
}
?>
Ben van Velzen op 26/12/2015 23:27:46
Of nog liever
<?
function blabla($event)
{
return $event["03-09-2016"][0][2];
}
?>

Euh, functies zouden herbruikbaar moeten zijn, ik zou dan op zijn minst ook een datum parameter verwachten, zodanig dat "blabla" alle events op die datum teruggeeft ofzo. Functies zouden een zekere toegevoegde waarde moeten hebben.
Nee Ben, dat zei je ook niet, dat maakte ik er van in al mijn onkunde.

Hoe dan ook; nu print hij inderdaad wel! Ik sta te trappelen om het in de originele code te proberen........ brb.
Mee eens, maar het gaat mij vooral om het wegwerken van die global. Ik ga er vanuit dat Simon weet hoe je functies hoort op te bouwen.
F**K YEAH.

Scoping dus.

Thanks a million!

[size=xsmall]Toevoeging op 26/12/2015 23:41:57:[/size]

Wat ik in eerste instantie postte was misschien niet netjes (zie originele code, dan zie je wel parameters). Maar het probleem was duidelijk en de oplossing nu ook.

Ik kan me niet herinneren dat het vroegah wat uitmaakte met dat scoping. Het werd wel 'netjes' bevonden, maar het parsen was vergevingsgezind.

Nogmaals dank!
PS

Kijk eens naar een [php]foreach[/php] constructie in plaats van die lastige constructie in je for loop die je nu gebruikt.
<?
for($i=0;$i<sizeof($item);$i++):
$event[$item[$i][1]][] = array($item[$i][0],$item[$i][2],$item[$i][4],$item[$i][5],$item[$i][6],$item[$i][7],$item[$i][8],$item[$i][9],$item[$i][10]);
endfor;
?>

OK, zo dan:

<?
foreach($item as $e)
{
$event[$e[1]][] = array($e[0],$e[2],$e[4],$e[5],$e[6],$e[7],$e[8],$e[9],$e[10]);
}
?>

Heb mezelf ooit wijsgemaakt dat het met arrays in arrays in arrays altijd knap ingewikkeld kan zijn met de foreach functie, zit dan telkens de print_r functie te gebruiken om uit te lezen wat ik dan weer fout doe .... heb meer overzicht met for. In dit geval lag foreach natuurlijk meer voor de hand.

Thanks.

Reageren