简体   繁体   中英

Can I add a variable value to a passed function parameter in php?

I have the following variable:

$argument = 'blue widget';

Which I pass in the following function:

widgets($argument);

The widgets function has two variables in it:

$price = '5';
$demand ='low';

My questions is how can I do the following:

 $argument = 'blue widget'.$price.' a bunch of other text';
 widgets($argument);
 //now have function output argument with the $price variable inserted where I wanted.
  • I don't want to pass $price to the function
  • price is made available once inside the function

Is there any sound way I can do this or do I need to rethink my design?

Off the top of my head, there are two ways to do this:

  1. Pass in two arguments

     widget($initText, $finalText) { echo $initText . $price . $finalText; } 
  2. Use a placeholder

     $placeholder = "blue widget {price} a bunch of other text"; widget($placeholder); function widget($placeholder) { echo str_replace('{price}',$price,$placeholder); } // within the function, use str_replace 

Here's an example: http://codepad.org/Tme2Blu8

Use some sort of placeholder, then replace it within your function:

widgets('blue widget ##price## a bunch of other text');

function widgets($argument) {
    $price = '5';
    $demand = 'low';

    $argument = str_replace('##price##', $price, $argument);
}

See it here in action: http://viper-7.com/zlXXkN

Create a placeholder for your variables like this:

$argument = 'blue widget :price a bunch of other text';

in your widget() function, use a dictionary array and str_replace() to get your result string:

function widgets($argument) {
  $dict = array(
    ':price'  => '20',
    ':demand' => 'low',
  );
  $argument = str_replace(array_keys($dict), array_values($dict), $argument);
}

I would encourage preg_replace_callback . By using this method, we can easily use the captured values as a lookup to determine what their replacement should be. If we come across an invalid key, perhaps the cause of a typo, we can respond to this as well.

// This will be called for every match ( $m represents the match )
function replacer ( $m ) {
    // Construct our array of replacements
    $data = array( "price" => 5, "demand" => "low" );
    // Return the proper value, or indicate key was invalid
    return isset( $data[ $m[1] ] ) ? $data[ $m[1] ] : "{invalid key}" ;
}

// Our main widget function which takes a string with placeholders
function widget ( $arguments ) {
    // Performs a lookup on anything between { and }
    echo preg_replace_callback( "/{(.+?)}/", 'replacer', $arguments );
}

// The price is 5 and {invalid key} demand is low.
widget( "The price is {price} and {nothing} demand is {demand}." );

Demo: http://codepad.org/9HvmQA6T

Yes, you can. Use global inside your function.

$global_var = 'a';
foo($global_var);

function foo($var){
    global $global_var;

    $global_var = 'some modifications'.$var;
}

Consider changing the argument and then returning it from your widget function rather than simply changing it within the function. It will be more clear to people reading your code that $argument is being modified without having to read the function as well.

$argument = widget($argument);

function widget($argument) {
    // get $price;
    return $argument . $price;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM