Php 如何内爆foreach

Php 如何内爆foreach,php,foreach,implode,Php,Foreach,Implode,如何用逗号内爆foreach()? foreach($names as $name) { //do something echo '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>'; } foreach($name作为$name){ //做点什么 回声'; } 要在每个链接后添加逗号,但最后一个链接除外。foreach($name为$name){ foreach($names

如何用逗号内爆
foreach()

foreach($names as $name) {
    //do something
    echo '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}
foreach($name作为$name){
//做点什么
回声';
}
要在每个链接后添加逗号,但最后一个链接除外。

foreach($name为$name){
foreach($names as $name) {
    //do something
    $str .= '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>,';
}
echo substr($str,0,-1);
//做点什么 $str.=','; } 回波子序列($str,0,-1);
编辑:
正如评论所指出的,如果您更改分隔符(确切地说是其长度)并忘记substr参数,那么这种方法很容易出错。因此,除非性能非常关键,否则请使用foreach方法。

下面是一个使用echo的丑陋解决方案:

 $total = (count($names) - 1 );

 foreach($names as $i => $name) 
 {
      if($i != $total) 
           echo '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>, ';
      else
           echo '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
 }
$total=(计数($names)-1);
foreach($i=>$name的名称)
{
如果($i!=$total)
回声',';
其他的
回声';
}

Ravelen的解决方案既高效又美观,但这里还有另一个解决方案(在类似场景中也很有用):

$elements=array();
foreach($name作为$name){
//做点什么
$elements[]='';
}
回波内爆(“,”,$elements);
$first=TRUE;
foreach($name作为$name){
//做点什么
如果(!$first){echo',';}
$first=FALSE;
回声';
}

您需要转换数组,而不是使用foreach进行迭代。你可以用它来做这件事

PHP5.3带闭包的语法

echo implode(", ", array_map(function($name) use($url, $title)
{
    return '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}, $names));
echo内爆(“,”,数组映射(函数($name)使用($url,$title)
{
返回“”;
}美元),;
PHP 5.3之前的兼容语法

function createLinkFromName($name)
{
    return '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}
echo implode(", ", array_map('createLinkFromName', $names));
函数createLinkFromName($name)
{
返回“”;
}
echo内爆(“,”,数组映射('createLinkFromName',$names));
PHP5.3语法具有更好的可靠性

function a_map($array, $function)
{
    return array_map($function, $array);
}

echo implode(", ", a_map($names, function($name) use($url, $title)
{
    return '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}));
函数a\u映射($array,$function)
{
返回数组\映射($function,$array);
}
echo内爆(“,”,a_映射($names,函数($name)use($url,$title)
{
返回“”;
}));
$s='';
foreach($name作为$name){
如果($s)$s=',';
$s.='';
}


为什么,这比内爆快…除非你改变分隔符,忘记调整
substr
@janmoesen,否则这是非常有效的。但这不是给我减号的理由:/对不起,我没有给你一个明确的减号;就是这个办法。我已经见过很多次了:以这种方式构建查询,然后
substr
将其转换为语法错误。我试图劝阻这种方法,当有一种更干净的方法来处理
内爆
@reinis时,你到底在说什么<代码>>因此,除非性能非常关键,否则请使用foreach方法。
请回忆下一票。一般来说,这一票应该比串接字符串快。如果使用字符串格式或变量替换来构建字符串,这可能会更快:
$elements[]=“但这一个速度较慢,既不可读也不实用。(不是更糟,我只是在为微观优化辩护)Blixt,这只是猜测,我找不到源代码,但在所有情况下,CONTAT和子字符串被标示为更快。真的,这只是猜测,但是一般来说,字符串格式也比较优雅,所以即使它比较慢,我也不会认为它是坏的变化。最后一个字符。宾果·麦克宾果,为我做了一个小把戏,最简单的方法就是把那个该死的逗号插入到一个现有的foreach循环中。嗯,有很多不同名称但相同URL的链接有什么意义呢?菲利克斯,你是一个读心术的人,能看到“//做点什么”?:-)我想你的意思是
如果(!$s)
,或者更好的
如果(strlen($s)==0)$s=',';
knittl,您可以通过检查isset($s[0])而不是strlen\o/No.
if($s)来保存函数调用
是正确的。我们不想以逗号开头。我们只想从第二个链接开始添加一个。但是你把我弄糊涂了,编辑了我的答案,然后将其还原。哦,好的,我没有意识到你对分隔符和字符串本身都使用了$s。很抱歉造成混淆。坦率地说,这几乎是不可读的,尤其是对于这是一项非常琐碎的任务。如果你对性能感兴趣的话,这很可能是最慢的解决方案。我想提出同样的建议,但你必须小心
$url
$title
。它们不会被设置(至少在PHP 5.3之前的示例中)。这不是比必要的复杂得多吗?不是那么复杂,不可读取性来自数组映射语法,它将函数放在第一位,这在使用闭包时不是一个明智的决定。我建议定义一个具有相反参数顺序的新函数,以提高可读性。微观优化:对于echo,使用逗号代替字符串连接的d:我会+1,除了在每次迭代中计算数组是非常浪费的(特别是如果数组是相当大的)…可能是预计算(
$numOfElements=count($names)-1;foreach…
)。。。
function createLinkFromName($name)
{
    return '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}
echo implode(", ", array_map('createLinkFromName', $names));
function a_map($array, $function)
{
    return array_map($function, $array);
}

echo implode(", ", a_map($names, function($name) use($url, $title)
{
    return '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}));
$s = '';
foreach ($names as $name) {
  if ($s) $s .= ', ';
  $s .= '<a href="' . $url . '" title="' . $title . '">' . $name . '</a>';
}