0

I have a foreach loop that creates a function for each array item. I need a unique name for each function created and would like to include the current array item in the function name but don't know how to do this.

At the moment I have the function named as "function ttm_global__shortcode()" however I would like it to be "function ttm_global_$acf_field_shortcode()"

$acf_fields = array("telephone_number", "fax_number", "email_address", "skype");

foreach($acf_fields as $acf_field) {    
    function ttm_global__shortcode() {
        ob_start();
        echo get_field($acf_field, 'options');
        $output = ob_get_contents();
        ob_end_clean();
        return $output; 
    }
    add_shortcode($acf_field, 'ttm_global_'.$acf_field.'_shortcode');
}

Thanks

2
  • 4
    I have to ask: why do you want to do this??? Commented Feb 20, 2012 at 16:51
  • is the second parameter of add_shortcode a callback?? Commented Feb 20, 2012 at 17:06

3 Answers 3

1

Using PHP 5.3 this can be done with anonymous functions

foreach($acf_fields as $acf_field) {
    add_shortcode($acf_field, function() use($acl_field) {
        // ...
    });
}
Sign up to request clarification or add additional context in comments.

Comments

1

If the second parameter of add_shortcode is a call back I think you can do it without creating such function.

$output = get_field($acf_field, 'options');
add_shortcode($acf_field, create_function('',"return '$output';"));

If you still want to create function.

Before PHP 5.3.0

Use create_function

foreach($acf_fields as $acf_field)
{  
    $funcs[$acf_field] = create_function('$acf_field', '
        ob_start();
        echo get_field($acf_field, 'options');
        $output = ob_get_contents();
        ob_end_clean();
        return $output;'
    );

 ....
 }

After PHP 5.3.0

foreach($acf_fields as $acf_field)
{  
    $funcs[$acf_field] = function($acf_field){
        ob_start();
        echo get_field($acf_field, 'options');
        $output = ob_get_contents();
        ob_end_clean();
        return $output;
    };

 ....
 }

Note: A parameter is added to your function.

5 Comments

This not really creates functions with the name asker wants, but create functions with random unique names stored in an associative array. In my opinion, the best solution that do not involve reflections or other advanced features. But the real question is why he need that?!?
@lorenzo-s Updated my answer It should be 2 lines of code. See the very beginning of the answer.
Nice solution, I mean, using the shortcodes (I do not know about that PHP feature). In fact, re-reading the question, I can't get why he want to create a function that returns a string using output buffering wrapping an echo on a function that already returns a string!!!
Thanks. The reason I may seem to be doing this is odd ways is because I am a web designer and aspiring front end developer.
@user1106742 If you feel this is the correct answer, accept it.
-1

You can use the create_function method to creates an anonymous function from the parameters passed, and returns a unique name for it.

<?php
function process($var1, $var2, $farr)
{
    foreach ($farr as $f) {
        echo $f($var1, $var2) . "\n";
    }
}

// create a bunch of math functions
$f1 = 'if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}';
$f2 = "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);";
$f3 = 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }';
$farr = array(
    create_function('$x,$y', 'return "some trig: ".(sin($x) + $x*cos($y));'),
    create_function('$x,$y', 'return "a hypotenuse: ".sqrt($x*$x + $y*$y);'),
    create_function('$a,$b', $f1),
    create_function('$a,$b', $f2),
    create_function('$a,$b', $f3)
    );

echo "\nUsing the first array of anonymous functions\n";
echo "parameters: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);

// now make a bunch of string processing functions
$garr = array(
    create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
    'and \"$b\"\n** Look the same to me! (looking at the first 3 chars)";'),
    create_function('$a,$b', '; return "CRCs: " . crc32($a) . ", ".crc32($b);'),
    create_function('$a,$b', '; return "similar(a,b) = " . similar_text($a, $b, &$p) . "($p%)";')
    );
echo "\nUsing the second array of anonymous functions\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>

check out http://us.php.net/manual/en/function.create-function.php for more details.

1 Comment

You can't just paste code from PHP manual comments, completely unrelated to user question. Just link to that page, it's better.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.