PHP使用数组依次替换字符串中匹配项

select * from table where ctime >= '[date-14]' and ctime <= '[date-1]';

想把上面这句sql的中括号表示的日期依次换成下面的数组中的元素
array('2015-07-01','2015-07-15');

  1. 用正则匹配:
    找到第一个中括号部分,用第一个元素替换,然后找第二个,再替换

  2. 用sprintf函数:
    因为日期已经计算好,按照顺序替换就可以了.

http://images2015.cnblogs.com/blog/463190/201601/463190-20160108113835137-914032124.jpg
因为markdown写正则比较麻烦,这里就直接上图片了

ps:设想一下,如sql中只有一个需要替换的时间条件,就需要修改成

$sql = sprintf($sql,$arr[0])

说白了呢就是如果sprintf函数支持第二个参数是数组就太好了。查了一番之后确实可以有解决办法:

call_user_func_array() 官方的解释是:
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数
mixed call_user_func_array ( callable $callback , array $param_arr )
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。

也就是说:第一个参数是你想要使用的函数名(上文中的sprintf),第二个参数是将要使用函数的参数,只不过参数是以数组形式传给了call_user_func_array
ok,这样的话就可以实现动态的替换了

$param = $arr;
array_unshift($param,$sql);
$sql = call_user_func_array('sprintf',$param);
posted @ 2016-01-08 11:33  hello大雄  阅读(3126)  评论(0编辑  收藏  举报