Returnen van alle values in een functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Guido  -

Guido -

19/07/2019 14:32:50
Quote Anchor link
Hallo,

Ik ben bezig met een functie om formulier velden te tonen, maar krijg het niet voor elkaar om alle velden te returnen.

Dit is een niet-volledig uitgewerkt voorbeeld (het gaat om de foreach):

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
function mijn_function()
    // hier initieer ik $fields en $value etc
    if( $fields ) {
        foreach( $fields as $field_name => $field ) {
            $the_field = '';
            $the_field .= '<p>';
                if ( $field['type'] == 'text' ) {
                    $the_field .= '<span>'.$value.'</span>';
                }
                if ( $field['type'] == 'textarea' ) {
                    $the_field .= '<span>'.$value.'</span>';
                }
                if ( $field['type'] == 'url' ) {
                    $the_field .= '<span>'.$value.'</span>';
                }
            $the_field .= '</p>';
            return $the_field;
        }
    }
}


Hij returned alleen het eerste veld (het 'text' veld). Ik weet dat dit normaal gedrag is, maar het lukt me niet om dit werkend te maken... zodat alle velden gereturned worden.

Moet ik het result omzetten naar een array en dan in één keer returnen? Wie kan me verder helpen?

Guido
Gewijzigd op 19/07/2019 15:59:07 door Guido -
 
PHP hulp

PHP hulp

19/04/2024 13:24:21
 
Adoptive Solution

Adoptive Solution

19/07/2019 14:59:29
Quote Anchor link
Er ontbreken alleen een paar { en $ tekens

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 mijn_function()
{

    if( $fields )
    {

        foreach( $fields as $field_name => $field )
        {

            $the_field = '';
            $the_field .= '<p>';
            if ( $field['type'] == 'text' )
            {

                $the_field .= '<span>'.$value.'</span>';
            }

            if ( $field['type'] == 'textarea' )
            {

                $the_field .= '<span>'.$value.'</span>';
            }

            if ( $field['type'] == 'url' )
            {

                $the_field .= '<span>'.$value.'</span>';
            }

            $the_field .= '</p>';
            return $the_field;
        }
    }
}

?>
 
- SanThe -

- SanThe -

19/07/2019 15:22:28
Quote Anchor link
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 mijn_function()
{

    $the_field = '';
    if( $fields )
    {

        foreach( $fields as $field_name => $field )
        {

            $the_field .= '<p>';
            if ( $field['type'] == 'text' )
            {

                $the_field .= '<span>'.$value.'</span>';
            }

            if ( $field['type'] == 'textarea' )
            {

                $the_field .= '<span>'.$value.'</span>';
            }

            if ( $field['type'] == 'url' )
            {

                $the_field .= '<span>'.$value.'</span>';
            }

            $the_field .= '</p>';
        }
    }

    return $the_field;
}

?>


Waar $fields vandaan komt zie ik niet.
Misschien handig om in de functie aanroep te zetten.

Dus: function mijn_function( $fields )
 
Thomas van den Heuvel

Thomas van den Heuvel

19/07/2019 15:24:25
Quote Anchor link
En $the_field staat binnen de foreach, dus geen wonder dat alleen het eerste veld wordt teruggegeven.
Het return-statement (regel 23) zou tussen regel 24 en 25 (in het fragment van @adoptive) geplaatst moeten worden.

Waar komt $fields trouwens vandaan (en hoe kan dit uberhaupt werken op dit moment, is dit een volledig codefragment)?

En wat gebeurt er als $fields niet bekend is? Dan wordt er niets geretourneerd. Het is meestal handiger als er altijd iets wordt teruggegeven, al was het maar false ofzo.
Gewijzigd op 19/07/2019 15:25:03 door Thomas van den Heuvel
 
Guido  -

Guido -

19/07/2019 15:53:12
Quote Anchor link
Quote:
Er ontbreken alleen een paar { en $ tekens

Stom, wordt aangepast. Maar nog steeds wordt alleen het eerste veld gereturned (type 'text').

Quote:
En $the_field staat binnen de foreach, dus geen wonder dat alleen het eerste veld wordt teruggegeven.

Als ik hem na de closing tag van de foreach plaats, wordt alleen de laatste veld gereturned (type 'url').

Ik had al aangegeven dat het om de foreach ging, de rest vd functie leek me niet relevant en daarom niet volledig vermeld. Overigens, als ik echo ipv return worden alle velden wel weergegeven.
 
Adoptive Solution

Adoptive Solution

19/07/2019 16:09:55
Quote Anchor link
Ik heb dit verzonnen.

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
<?php
function mijn_function( $fields )
{

    $the_field = '';
    foreach( $fields as $field_name => $field )
    {

        $the_field .= '<p>';
        if ( $field_name == 'text' )
        {

            $the_field .= '<span>' . $field . '</span>';
        }

        if ( $field_name == 'textarea' )
        {

            $the_field .= '<span>' . $field . '</span>';
        }

        if ( $field_name == 'url' )
        {

            $the_field .= '<span>' . $field . '</span>';
        }

        $the_field .= '</p>' . PHP_EOL;
    }

    return $the_field;
}



$inputvelden = [];
$inputvelden['text'] = 'Een tekst';
$inputvelden['textarea'] = 'Tekst in een textarea';
$inputvelden['url'] = 'http://www.example.com';

echo mijn_function( $inputvelden );
?>


Krijg je dit

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<p><span>Een tekst</span></p>
<p><span>Tekst in een textarea</span></p>
<p><span>http://www.example.com</span></p>
Gewijzigd op 19/07/2019 16:12:14 door Adoptive Solution
 
Thomas van den Heuvel

Thomas van den Heuvel

19/07/2019 17:01:34
Quote Anchor link
Wil je ook echt een lege paragraaf retourneren als de veldnaam niet bekend is?
En is het waarschijnlijk dat de verschillende veldtypen een verschillende opmaak krijgen, en het bovenstaande gevalsonderscheid dus geoorloofd is?

Anders kan het namelijk allemaal een stuk korter.

Misschien is het ook het overwegen waard om hier output buffering te gebruiken, in plaats van alles te concateneren in een string.

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
<?php
function my_function($fields) {
    ob_start();
        foreach ($fields as $type => $text) {
            if (in_array($type, array(
                'text',
                'textarea',
                'url',
            ))) {

                ?>
<p><span><?php echo $text; ?></span></p><?php
            } else {
                ?>
<p></p><?php
            }
        }

    return ob_get_clean();
}

?>
Gewijzigd op 19/07/2019 17:02:03 door Thomas van den Heuvel
 
Guido  -

Guido -

19/07/2019 17:17:43
Quote Anchor link
Hoi,

Ik heb niet de volledige inhoud van de functie hier weergegeven omdat het binnen WordPress gebruikt wordt en ik native WordPress functies aanroep, die ik anders allemaal hier moet gaan uitleggen.

Daarom dacht ik dat ik kon volstaan met de kern van mijn probleem: hij returned alleen het eerste of laatste veld (afhankelijk op welke locatie ik return plaats binnen de functie).

Quote:
Wil je ook echt een lege paragraaf retourneren als de veldnaam niet bekend is?

Nee sorry, als veld type niet ondersteund wordt moet hij inderdaad een melding returnen (had ik niet verwerkt in mijn voorbeeld).

Echo gebruiken is helaas geen optie, omdat ik de output weer in een andere functie aanroep.

Guido
 
Thomas van den Heuvel

Thomas van den Heuvel

19/07/2019 19:26:59
Quote Anchor link
Guido - op 19/07/2019 17:17:43:
Echo gebruiken is helaas geen optie, omdat ik de output weer in een andere functie aanroep.

Je bedoelt dat het niet de bedoeling is dat de functie zelf output produceert? Dat gebeurt ook niet want de output wordt opgevangen in een buffer. Vandaar output buffering. Alle "output" wordt dus nog steeds geretourneerd als string, maar dan zonder al dat gedoe met quotes, concatenering en de hele santekraam.
 



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.