这很有趣。这个解决方案怎么样?
function pipe($v, $fs)
{
foreach(explode('|', $fs) as $f)
{
if(strpos($f, '[') === FALSE){
$v = call_user_func($f, $v);
}else{
list($fun, $args) = explode('[', trim($f), 2);
$args = explode(',', str_replace('!', $v, substr($args, 0, -1)));
$v = call_user_func_array($fun, $args);
}
}
return $v;
}
echo pipe(' test STRING??', 'trim|strtolower|str_repeat[!,3]|str_replace[string,cheese,!]');
这打印出来
test cheese??test cheese??test cheese??
函数管道有两个参数。第一个是初始值,第二个是要应用于第一个参数的以竖线分隔的函数列表。为了允许多参数函数,可以使用 [ 和 ] 字符(就像在 PHP 中使用括号一样)。占位符“!” 可用于指定沿链插入字符串的位置。
在上面的示例中,会发生以下情况:
trim(' test STRING??') => 'test STRING??'
strtolower('test STRING??') => 'test string??'
str_repeat('test string??', 3) => 'test string??test string??test string??'
str_replace('string', 'cheese', 'test string??test string??test string??') => 'test cheese??test cheese??test cheese??'
字符 [、] 和 ! 是随意选择的。此外,这不允许您在函数参数中使用逗号,尽管它可以扩展以允许这样做。
有趣的问题!
(从 Code Igniter 获取的 '|' 分隔函数列表的想法,尽管它们不进行变量替换。它也可以很容易地成为字符串数组,但 array() 构造函数很冗长)