Een return in een functie wordt genegeerd?
Ik ben bezig met een functie waarin ik wil controleren of uit een gegeven array een bepaalde key met bepaalde value aanwezig is. Dit omdat de in_array() functie tekort schiet omdat die functie volledige arrays met elkaar vergelijkt en mijn arrays binnen de globale array verschillen. Ook met de functie array_search kwam ik niet uit de voeten en ben ik aan de slag gegaan met een eigen functie. Naar eigen zeggen lekker compact, duidelijk en mogelijk interessant voor derden. Hieronder de functie met een voorbeeld:
Zoals je ziet maak ik gebruik recursie om geneste arrays binnen een array uit te filteren. Met bovenstaande testdata-array wordt, zoals verwacht, een match gevonden. Hetgeen waar het misgaat is de return bij een match. De regel 'return true' wordt genegeerd. Is er een regel binnen recursie dat de functie dan afdwingt dat eerst de volledige dataset wordt afgewerkt? Want dan is het logisch, maar hoe hou ik dan bij of er al een match gevonden is?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function array_search_key_value($needle, array $haystack, $searchKey)
{
foreach($haystack as $key => $value)
{
if(is_array($value))
array_search_key_value($needle, $haystack[$key], $searchKey);
else
if($key == $searchKey && $value == $needle)
return true;
}
}
$testdata = array(array("month" => "062009", "nogwat" => 0, "nogmeer" => "test"), array("month" => "072009"));
if(array_search_key_value("062009", $testdata, "month"))
echo "Match";
else
echo "Geen match";
?>
function array_search_key_value($needle, array $haystack, $searchKey)
{
foreach($haystack as $key => $value)
{
if(is_array($value))
array_search_key_value($needle, $haystack[$key], $searchKey);
else
if($key == $searchKey && $value == $needle)
return true;
}
}
$testdata = array(array("month" => "062009", "nogwat" => 0, "nogmeer" => "test"), array("month" => "072009"));
if(array_search_key_value("062009", $testdata, "month"))
echo "Match";
else
echo "Geen match";
?>
Het lijkt mij dat een return true de functie toch zou moeten afbreken en het resultaat (in dit geval: true) teruggeeft.
Iemand een idee?
Gewijzigd op 01/01/1970 01:00:00 door Ben
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function array_search_key_value($needle, array $haystack, $searchKey)
{
foreach($haystack as $key => $value)
{
if(is_array($value))
return array_search_key_value($needle, $haystack[$key], $searchKey);
else
if($key == $searchKey && $value == $needle)
return true;
}
}
$testdata = array(array("month" => "062009", "nogwat" => 0, "nogmeer" => "test"), array("month" => "072009"));
if(array_search_key_value("062009", $testdata, "month"))
echo "Match";
else
echo "Geen match";
?>
function array_search_key_value($needle, array $haystack, $searchKey)
{
foreach($haystack as $key => $value)
{
if(is_array($value))
return array_search_key_value($needle, $haystack[$key], $searchKey);
else
if($key == $searchKey && $value == $needle)
return true;
}
}
$testdata = array(array("month" => "062009", "nogwat" => 0, "nogmeer" => "test"), array("month" => "072009"));
if(array_search_key_value("062009", $testdata, "month"))
echo "Match";
else
echo "Geen match";
?>
Gelieve Niet Bumpen::
Gewijzigd op 01/01/1970 01:00:00 door Ben
Ben schreef op 07.07.2009 19:07:
Het lijkt mij dat een return true de functie toch zou moeten afbreken en het resultaat (in dit geval: true) teruggeeft.
Klopt.
Maar alléén als de function dus niet zichzelf aanroept.
Nadat de funtion zichzelf heeft aangeroepen en dan een return krijgt springt ie terug naar de vorige set in de function en die geeft dan niets retour.
Edit naar aanleiding van je oplossing:
Je hebt nu dit:
Code (php)
Maar wat is de return waarde als de if() en de elseif() beiden niet voldoen?
Je mist nu nog de return false.
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
Is het niet zo dat indien er geen true wordt geretourneerd er standaard false wordt teruggegeven? Want als ik mijn test-aanroep verander met een waarde die niet in de array zit krijgt ik gewoon 'Geen match'.
P.s. ik heb niet gebumped ;) Ik postte dat mijn probleem al was opgelost :)
Gewijzigd op 01/01/1970 01:00:00 door Ben
Had je een pm naar iemand moet sturen of ze in je topic willen posten, is iedereen blij ;)
Het was in ieder geval niet bedoeld om te bumpen maar om aan te geven dat het opgelost was ;) Bedankt voor de reacties SanThe!
Ben schreef op 07.07.2009 22:18:
Het was in ieder geval niet bedoeld om te bumpen maar om aan te geven dat het opgelost was ;) Bedankt voor de reacties SanThe!
Dat weet ik ook wel. Ik vind alleen dat ik consequent moet zijn en blijven.
Persoonlijk vind ik het veel belangrijker dat je nog even de moeite neemt om de oplossing te vermelden. Dat wordt, helaas, nog wel eens vergeten.
SanThe.