从对象数组的单个列创建逗号分隔的字符串

24
我正在使用foreach循环从数据库中输出一些值,如果有必要,我需要从最后一个loop中删除最后一个逗号。我的循环很简单,如下所示:
foreach($results as $result){
  echo $result->name.',';
}

输出的是什么

result,result,result,result,
我只需要删掉那个讨厌的最后一个逗号。
15个回答

117
更好的写法:
$resultstr = array();
foreach ($results as $result) {
  $resultstr[] = $result->name;
}
echo implode(",",$resultstr);

30

1. 连接字符串但在前面添加 |

$s = '';
foreach ($results as $result) { 
    if ($s) $s .= '|';
    $s .= $result->name; 
}
echo $s;

2. 如果不是最后一个项目,仅打印回声|

$s = '';
$n = count($results);
foreach ($results as $i => $result) { 
    $s .= $result->name;
    if (($i+1) != $n) $s .= '|';
}
echo $s;

3. 将数据加载到数组中,然后使用implode函数

$s = array();
foreach ($results as $result) { 
    $s[] = $result->name;
}
echo implode('|', $s);

4. 将字符串连接后再删除最后一个 |(或使用rtrim函数)

$s = '';
foreach ($results as $result) { 
    $s .= $result->name . '|';
}
echo substr($s, 0, -1); # or # echo rtrim($s, '|');

5. 使用 array_map() 连接字符串

echo implode('|', array_map(function($result) { return $result->name; }, $results));

使用array_map连接字符串是最好的。 - Faizan Anwer Ali Rupani

14
$result_names = '';
foreach($results as $result){
    $result_names .= $result->name.',';
}
echo rtrim($result_names, ',');

这会杀死循环中的每个逗号,不仅仅是输出字符串末尾的那一个吧? - Cecil
1
我在意识到你在循环内部回显后编辑了代码片段。 - Mike
如果值的输出不是一个数组,它会在每个值之后添加逗号,包括最后一个值。 - undefined

2
最近我遇到了类似的问题。我通过使用一个增量变量 $i 来解决它,将其初始化为 0,然后在 foreach 循环中使其递增。在该循环中放置一个 if 和 else,如果 $i 计数器小于数组/变量的 sizeof() 运算符,则包含逗号的 echo 语句。
我不知道这是否会解决你的问题,但它帮助了我解决我的问题。我对 PHP 还比较陌生,因此我不太理解之前给出的许多答案,尽管它们非常有见地,特别是 implode 的答案。
$i=0;
foreach ($results as $result) {
    $i++;
    if(sizeof($results) > $i) {
        echo $result . ", ";
    } else {
        echo $result;
    }
}

2
在现代PHP中,array_column()函数可以让你从一个对象数组中获取指定列的数据。
代码:(演示)
$results = [
    (object)['name' => 'A'],
    (object)['name' => 'B'],
    (object)['name' => 'C']
];

echo implode(',', array_column($results, 'name'));

输出:

A,B,C

话虽如此,既然你正在迭代结果集,那么最好在sql中调用CONCAT()函数,以便将值已经连接在单个值的结果集中。


如果你正在处理Laravel中的集合,你可以使用pluck()implode()

$collection->pluck('name')->implode(',')

0

另一种聪明的方法是:

foreach($results as $result){
  echo ($passed ? ',' : '') . $result->name;
  $passed = true;
}

在这种情况下,在第一次循环中,$passedNULL,因此不会打印出 ,

0

我知道这是一个旧的帖子,但最近出现了这个问题,我想分享一下我的替代方法,使用next()。

$array = array("A thing", "A whatsit", "eighty flange oscillators");
          
foreach( $array as $value ){
    echo $value;
    $nxt = next($array);
    if($nxt) echo ", "; // commas between each item in the list
    else echo ". And that's it."; // no comma after the last item.
}

// outputs: 
// A thing, A whatsit, eighty flange oscillators. And that's it.

在这里玩耍


如果$nxt具有“falsey”值怎么办?这种方法不稳定/可靠。 - mickmackusa

0
$arraySize = count($results);
for($i=0; $i<$arraySize; $i++)
{
  $comma = ($i<$arraySize) ? ", " : "";
  echo $results[$i]->name.$comma;
}

0

不太好看,但也能用:

$first=true;
foreach($results as $result){
    if(!$first) { echo ', '; }
    $first=false;
    echo $result->name;
}

这只是省略了第一项的逗号。问题是关于最后一项的。 - Kalnode

-1
<?php
$i = 1;
$count = count( $results );
foreach( $results as $result ) {
    echo $result->name;
    if ( $i < $count ) echo ", ";                               
    ++$i;
}
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接