PHP是否支持循环插值?有无无需退出字符串插值的实现技巧?
PHP是否支持循环插值?有无无需退出字符串插值的实现技巧?
嘿,这个需求太接地气了!咱们直接说结论:PHP原生的字符串插值本身不支持直接在字符串里写循环逻辑,但有几个实用技巧能帮你实现类似“不退出字符串拼接”的效果,完美替代你原来的foreach写法~
首先,最直接的方案是用implode()函数配合PHP的表达式插值(PHP 5.6及以上支持)。你原来的代码是循环把$ATTR数组里的属性一个个拼进去,其实本质就是把数组元素用空格连接起来,implode(' ', $ATTR)就能搞定这一步,然后直接把这个表达式放到双引号字符串的{}里就行:
$r .= "<$starttag {implode(' ', $ATTR)} >$a<$endtag> ";
这样就不用把字符串拆成好几段拼接,完全在一个双引号字符串里完成,是不是和你想要的写法很接近?
不过这里有个小细节:如果$ATTR是空数组,上面的写法会多出来一个空格(变成<div >这种),看着有点别扭。可以加个简单的判断优化一下:
$r .= "<$starttag{!empty($ATTR) ? ' ' . implode(' ', $ATTR) : ''}>$a<$endtag> ";
这样当数组为空时,就不会多那个多余的空格了。
另外,如果你的$ATTR是键值对数组(比如['class' => 'box', 'id' => 'main']),而不是直接的属性字符串,那得先把键值对转换成key='value'的格式,再用implode拼接。比如用array_map()处理:
$attrPairs = array_map(function($key, $val) { return "$key='$val'"; }, array_keys($ATTR), $ATTR); $r .= "<$starttag {implode(' ', $attrPairs)} >$a<$endtag> ";
或者用http_build_query()快速生成(注意它会自动转义特殊字符,适合需要转义的场景):
$attrs = str_replace('&', ' ', http_build_query($ATTR, '', ' ')); $r .= "<$starttag $attrs>$a<$endtag> ";
哦对了,你提到的{@$ATTR, }这种写法,PHP里并没有这种语法,所以没法直接用。但上面这些技巧完全能达到你想要的“不跳出字符串插值”的简洁效果~
备注:内容来源于stack exchange,提问作者George Kourtis
相关产品推荐
相关产品推荐

