Esto es de php.net
function vnsprintf($format, array $data)
{
preg_match_all('/ (?<!%) % ((?: [[:alpha:]_-][[:alnum:]_-]* | ([-+])? [0-9]+ (?(2) (?:\.[0-9]+)? | \.[0-9]+))) \$ [-+]? \'? .? -? [0-9]* (\.[0-9]+)? \w/x', $format, $match, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
$offset = 0;
$keys = array_keys($data);
foreach($match as &$value)
{
if (($key = array_search($value[1][0], $keys, TRUE)) !== FALSE || (is_numeric($value[1][0]) && ($key = array_search((int)$value[1][0], $keys, TRUE)) !== FALSE))
{
$len = strlen($value[1][0]);
$format = substr_replace($format, 1 + $key, $offset + $value[1][1], $len);
$offset -= $len - strlen(1 + $key);
}
}
return vsprintf($format, $data);
}
Ejemplo:
$example = array(
0 => 'first',
'second' => 'second',
'third',
4.2 => 'fourth',
'fifth',
-6.7 => 'sixth',
'seventh',
'eighth',
'9' => 'ninth',
'tenth' => 'tenth',
'-11.3' => 'eleventh',
'twelfth'
);
echo vnsprintf('%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s %10$s %11$s %12$s<br />', $example); // acts like vsprintf
echo vnsprintf('%+0$s %second$s %+1$s %+4$s %+5$s %-6.5$s %+6$s %+7$s %+9$s %tenth$s %-11.3$s %+10$s<br />', $example);
Ejemplo 2:
$examples = array(
2.8=>'positiveFloat', // key = 2 , 1st value
-3=>'negativeInteger', // key = -3 , 2nd value
'my_name'=>'someString' // key = my_name , 3rd value
);
echo vsprintf("%%my_name\$s = '%my_name\$s'\n", $examples); // [unsupported]
echo vnsprintf("%%my_name\$s = '%my_name\$s'\n", $examples); // output : "someString"
echo vsprintf("%%2.5\$s = '%2.5\$s'\n", $examples); // [unsupported]
echo vnsprintf("%%2.5\$s = '%2.5\$s'\n", $examples); // output : "positiveFloat"
echo vsprintf("%%+2.5\$s = '%+2.5\$s'\n", $examples); // [unsupported]
echo vnsprintf("%%+2.5\$s = '%+2.5\$s'\n", $examples); // output : "positiveFloat"
echo vsprintf("%%-3.2\$s = '%-3.2\$s'\n", $examples); // [unsupported]
echo vnsprintf("%%-3.2\$s = '%-3.2\$s'\n", $examples); // output : "negativeInteger"
echo vsprintf("%%2\$s = '%2\$s'\n", $examples); // output : "negativeInteger"
echo vnsprintf("%%2\$s = '%2\$s'\n", $examples); // output : [= vsprintf]
echo vsprintf("%%+2\$s = '%+2\$s'\n", $examples); // [unsupported]
echo vnsprintf("%%+2\$s = '%+2\$s'\n", $examples); // output : "positiveFloat"
echo vsprintf("%%-3\$s = '%-3\$s'\n", $examples); // [unsupported]
echo vnsprintf("%%-3\$s = '%-3\$s'\n", $examples); // output : "negativeInteger"
** seealso: ** https://stackoverflow.com/questions/13325698/php-sprintf-with-array – dreftymac