Een return in een functie wordt genegeerd?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ben

Ben

07/07/2009 19:07:00
Quote Anchor link
Hallo allemaal,

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)
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
<?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";
?>


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
 
PHP hulp

PHP hulp

07/05/2021 00:20:39
 
Ben

Ben

07/07/2009 21:06:00
Quote Anchor link
Opgelost. Er ontbrak een return indien een subarray moest worden behandeld. Hopelijk heeft iemand er ooit iets aan.

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
<?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";
?>


Gelieve Niet Bumpen::
Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de http://www.phphulp.nl/imgs/forum/edit.gif knop om je tekst aan te passen.

SanThe.
Gewijzigd op 01/01/1970 01:00:00 door Ben
 
- SanThe -

- SanThe -

07/07/2009 21:16:00
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
foreach($haystack as $key => $value)
{

      if(is_array($value))
          return array_search_key_value(...);
      elseif($key == $searchKey && $value == $needle)
          return true;
}

?>

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 -
 
Ben

Ben

07/07/2009 21:49:00
Quote Anchor link
Bedankt voor je antwoord.

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
 
- SanThe -

- SanThe -

07/07/2009 21:59:00
Quote Anchor link
Het zal wel werken. Maar het is netter en zekerder om zelf ook een false te returnen in geval niets matched.

P.S. Sorry, ik heb het ook niet verzonnen: http://www.phphulp.nl/faq/#24
 
Afra ca

Afra ca

07/07/2009 22:16:00
Quote Anchor link
Had je een pm naar iemand moet sturen of ze in je topic willen posten, is iedereen blij ;)
 
Ben

Ben

07/07/2009 22:18:00
Quote Anchor link
Dat het netter is ben ik met je eens, ik ga het aanpassen.

Het was in ieder geval niet bedoeld om te bumpen maar om aan te geven dat het opgelost was ;) Bedankt voor de reacties SanThe!
 
- SanThe -

- SanThe -

07/07/2009 22:47:00
Quote Anchor link
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.
 



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.