PHP/JS:删除分隔列表中的最后一个逗号


PHP/JS: Removing final comma in a delimited list

在典型的for循环中生成逗号交付列表时,消除最后一个逗号的最佳、最简洁的编码实践是什么?这种情况经常出现,我无法忍受为这么简单的事情写这么多额外的代码行。。。必须有更好的技术/模式。

foreach ($list as $item)
{
    echo "'".$item . "',";
}

除了最后一次迭代之外,让上面的代码在任何地方都产生逗号的最佳方法是什么(使用PHP和/或JS(?

现在我正在做这样的事情:

$total = count($images);
$i=0;
foreach ($list as $item)
{
    $i++;
    echo "'".$item."'";
    if ($i<$total) echo ',';
}

但这为如此简单的事情添加了四行代码。。。

标准PHP库(SPL(提供了一个方便的类CachingIterator,可以用来查看是否还有其他项需要迭代。以下内容可能没有您希望的那么简洁,但它是灵活的(即,可以用于远远不止数组(。

$array = range('a', 'g');
$cache = new CachingIterator(new ArrayIterator($array));
foreach ($cache as $item) {
    echo "'$item'";
    if ($cache->hasNext()) {
        echo ',';
    }
}

上面的例子输出

'a','b','c','d','e','f','g'

如果您没有简化代码示例:

echo implode(',', $list);

执行(另请参阅implodePHP手册(。

如果foreach循环中有更多的代码,您需要跟踪是否在最后一个元素上,并处理这种情况:

$count = count($list);
$current = 0;
foreach ($list as $item)
{
    $current++;
    $notLast = $current !== $count;
    echo $item;
    if ($notLast) echo ',';
}

编辑:在我回答这个问题后,你在问题中添加了一个类似的代码,所以如果这对你的编码手指来说太麻烦了,尤其是(而且可以理解(你不想整天重复这样的代码,你需要将其封装以供重复使用。一种解决方案是在一个可重复使用的迭代器中实现这一点:

$list = array('a', 'b', 'c');
class PositionKnowingIterator implements iterator
{
    /**
     * @var iterator 
     */
    private $inner;
    private $count;
    private $index;
    public function __construct(array $list) {
        // NOTE: implement more iterators / objects to deal with in here
        //       if you like. This constructor limits it to arrays but
        //       more is possible.
        $this->count = count($list);
        $this->inner = new ArrayIterator($list);
    }
    /* SPL iterator implementation */
    public function current() {
        return $this->inner->current();
    }
    public function next() {
        $this->index++;
        $this->inner->next();
    }
    public function key() {
        $this->inner->key();
    }
    public function rewind() {
        $this->index = 1;
        $this->inner->rewind();
    }
    public function valid() {
        return $this->inner->valid();
    }
    /* Position Knowing */
    public function isLast() {
        return $this->index === $this->count;
    }
    public function notLast() {
        return !$this->isLast();
    }
    public function isFirst() {
        return $this->index === 1;
    }
    public function notFirst() {
        return !$this->isFirst();
    }
    public function isInside() {
        return $this->notFirst() && $this->notLast();
    }
}

foreach($iterator = new PositionKnowingIterator($list) as $item)
{
    echo "'".$item."'", $iterator->notLast() ? ',' : '';
}
echo implode(",", $list);

不使用foreach所需的

用户内爆((函数来实现这一点。有时还需要添加一些内容,例如引用SQL字段的值:

$fields = '"' . join('", "', $values) . '"';

对于JavaScript使用Array.join()方法(W3C(:

var implodedString = someArray.join(',')

如果我说得对,您可以使用内爆函数。这是为你做的工作。

BR,

TJ

为什么不:

echo implode(",", $list);

常用的做法:使用'join'函数或其类似函数。这个函数几乎存在于每种语言中,所以它是最简单、最清晰、最独立于环境的方法。

echo join(", ", $list);