Re: sprintf and arrays.

From: Date: Wed, 06 Apr 2005 15:40:03 +0000
Subject: Re: sprintf and arrays.
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-212430@lists.php.net to get a copy of this message
For one, you are missing a right parenthesis ) in all of your examples. htmlentities( sprintf( $tmp[0], $s, ENT_QUOTES ) Second, the string you are trying to format only has one variable argument: $s. Fred likes %1$s on his %2$s You have it numbered for ordering, but you are still ordering one variable. I never used sprintf like that, so I'm not sure if that is a valid way of doing it. That may be what is giving you the too few arguments error. Typically you would do something like: Fred likes %1$s on his %2$t If you are using sprintf in a valid manner, then the problem is probably in the $s argument of the sprintf function. You are only specifying one variable to replace when you are looking to do two replacements. The contents of $s is a single string that happens to contains commas, it does not get evaluated as multiple arguments just because it contains commas. Try wrapping $s in eval(). htmlentities( sprintf( $tmp[0], eval($s) ), ENT_QUOTES); Personally, I rolled my own basic search and replace string function to support my own templating "tag" system. I still use sprinf for more "fancy" stuff, but for basic stuff, I rolled my own. A simplified version is below. It accepts an associative array and a string as parameters and returns the merged result. $text_str = "And example for {::Name::} in answer to {::Question::} on the {::ListName::}. Hope it helps {::Name::}!"; $data_Merge['Name'] = "Duncan Hill"; $data_Merge['Question'] = "sprintf and arrays"; $data_Merge['ListName'] = "PHP General"; echo mergeTplData($data_Merge, $text_str); function mergeTplData($data, $str) { $searchTags = array_keys($data); $searchTags = '{::'.implode('::},{::',$searchTags).'::}'; $searchTags = explode(',',$searchTags); $str = str_replace($searchTags,$data,$str); return $str; } On Apr 6, 2005, at 7:23 AM, Duncan Hill wrote:
I have a snippet of code that looks something like: if (is_array($p_sub_values)) {
        foreach ($p_sub_values as $i => $v) {
         $p_sub_values_str[$i] = "'$v'";
        }
        $s = join(',', $p_sub_values_str);
        $r = htmlentities(sprintf($tmp[0], $s, ENT_QUOTES);
} $tmp[0] in this case contains a string like 'Fred likes %1$s on his %2$s', taking advantage of positional substitution with sprintf. The function call to this snippet can have an optional array passed. My need/desire is to substitute each element of the array into the appropriate position with sprintf. So far I've tried: $r = htmlentities(sprintf($tmp[0], $s, ENT_QUOTES); $r = htmlentities(sprintf($tmp[0], ${$s}, ENT_QUOTES); and a few other bits and pieces, all to no avail (error is about not enough arguments). Is there any way to accomplish this in PHP, or do I need to roll my own substitution code? The array can obviously be anything from a single value to 'unlimited' (though in practice will probably be less than 5). -- My mind not only wanders, it sometimes leaves completely. -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php -- Brent Baisley Systems Architect Landover Associates, Inc. Search & Advisory Services for Advanced Technology Environments p: 212.759.6400/800.759.0577


« previous php.general (#212430) next »