如何在PHP中从数组创建逗号分隔的列表?

128
我知道如何使用foreach遍历数组中的项目并添加逗号,但是总是很麻烦地去掉最后一个逗号。有没有一种简单的PHP方法可以做到这一点?
$fruit = array('apple', 'banana', 'pear', 'grape');

最终我想要的是

$result = "apple, banana, pear, grape"
11个回答

248
你想要使用implode来完成这个任务。
例如: $commaList = implode(', ', $fruit);
有一种方法可以在没有尾随逗号的情况下添加逗号。如果您需要同时进行其他操作,您可能希望这样做。例如,也许您想引用每种水果,然后用逗号将它们分开:
$prefix = $fruitList = '';
foreach ($fruits as $fruit)
{
    $fruitList .= $prefix . '"' . $fruit . '"';
    $prefix = ', ';
}

另外,如果你只是按照“正常”的方式在每个项目后面添加逗号(就像你之前做的那样),并且你需要去掉最后一个逗号,只需执行$list = rtrim($list, ', ')。我看到很多人在这种情况下不必要地使用substr

4
若要添加引号,调用<code>$fruitlist = '"' . implode( '", "', $fruit) . '"';</code>会更合理。 - cwallenpoole
如果您想在将数据转换为字符串之前操作数组中的数据,那么foreach循环更好;例如,addslashes或mysql_real_escape_string。 - Naphtali Gilead
边缘情况:一个包含单引号和双引号的字符串 - 如何进行调整? - Rick Hellewell

40

这是我一直以来的做法:

$arr = array(1,2,3,4,5,6,7,8,9);

$string = rtrim(implode(',', $arr), ',');

echo $string;

输出:

1,2,3,4,5,6,7,8,9

演示地址:http://ideone.com/EWK1XR

编辑: 根据 @joseantgv 的评论,你应该能够从上面的示例中删除 rtrim()。也就是说:

$string = implode(',', $arr);

5
如上所述,您可以使用 implode(',', $arr) 来实现。 - joseantgv
@joseantgv 你说得对,我不知道为什么要使用 rtrim()。我记得曾经遇到过字符串末尾有多余逗号的问题,但是现在想不起来具体情况了。 - Nate

9

and 结尾的结果:

$titleString = array('apple', 'banana', 'pear', 'grape');
$totalTitles = count($titleString);
if ($totalTitles>1) {
    $titleString = implode(', ', array_slice($titleString, 0, $totalTitles-1)) . ' and ' . end($titleString);
} else {
    $titleString = implode(', ', $titleString);
}

echo $titleString; // apple, banana, pear and grape

4
$fruit = array('apple', 'banana', 'pear', 'grape');    
$commasaprated = implode(',' , $fruit);

最简单的答案。何必写十几行代码,当你可以用一行代码就搞定它呢。 - Adil Malik

4
与Lloyd的答案类似,但适用于任何大小的数组。
$missing = array();
$missing[] = 'name';
$missing[] = 'zipcode';
$missing[] = 'phone';

if( is_array($missing) && count($missing) > 0 )
        {
            $result = '';
            $total = count($missing) - 1;
            for($i = 0; $i <= $total; $i++)
            { 
              if($i == $total && $total > 0)
                   $result .= "and ";

              $result .= $missing[$i];

              if($i < $total)
                $result .= ", ";
            }

            echo 'You need to provide your '.$result.'.';
            // Echos "You need to provide your name, zipcode, and phone."
        }

3

我更喜欢在FOR循环中使用IF语句来检查当前迭代是否为数组中的最后一个值。如果不是,则添加逗号。

$fruit = array("apple", "banana", "pear", "grape");

for($i = 0; $i < count($fruit); $i++){
    echo "$fruit[$i]";
    if($i < (count($fruit) -1)){
      echo ", ";
    }
}

2
如果总计数不等于4,返回已翻译的文本。 - Jyothish

1
有时候在某些情况下(例如,列表项在渲染时都在它们自己的通用标签中),甚至不需要使用php。如果它们在脚本被渲染后是单独的元素,你可以通过css为除了最后一个元素以外的所有元素添加逗号。
实际上,我经常在backbone应用程序中使用它来减少一些任意的代码冗余。
.likers a:not(:last-child):after { content: ","; }

基本上,它查看元素,针对除了最后一个元素以外的所有元素,并在每个项目之后添加逗号。如果情况适用,则只是不必使用脚本的另一种替代方法。

0

跟着这个走

$teacher_id = '';

        for ($i = 0; $i < count($data['teacher_id']); $i++) {

            $teacher_id .= $data['teacher_id'][$i].',';

        }
        $teacher_id = rtrim($teacher_id, ',');
        echo $teacher_id; exit;

0
一个函数式的解决方案是这样的:
$fruit = array('apple', 'banana', 'pear', 'grape');
$sep = ','; 

array_reduce(
    $fruits,
    function($fruitsStr, $fruit) use ($sep) {
        return (('' == $fruitsStr) ? $fruit : $fruitsStr . $sep . $fruit);
    },
    ''
);

-1

如果在引用回答时,您可以这样做

$commaList = '"'.implode( '" , " ', $fruit). '"';

以上假设水果不为空。如果您不想做出这种假设,可以使用if-then-else语句或三元(?:)运算符。


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