PHP / JS:删除分隔列表中的最终逗号

时间:2011-07-17 10:45:14

标签: php javascript coding-style

在典型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 ',';
}

但是这为简单的事情添加了四条代码......

7 个答案:

答案 0 :(得分:5)

Standard PHP Library(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'

答案 1 :(得分:4)

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

echo implode(',', $list);

做到了(另见implode PHP Manual)。

如果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() ? ',' : '';
}

答案 2 :(得分:2)

echo implode(",", $list);

不使用foreach需要

答案 3 :(得分:1)

如果我说得对,你可以使用implode功能。 这对你有用。

BR,

TJ

答案 4 :(得分:1)

为什么不:

echo implode(",", $list);

答案 5 :(得分:1)

用户implode()功能来实现这一目标。有时,还需要放置一些东西,例如,引用SQL字段的值:

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

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

var implodedString = someArray.join(',')

答案 6 :(得分:0)

常用的做法:使用'join'功能或其模拟功能。这个函数几乎存在于每种语言中,因此它是最简单,最清晰且与环境无关的方法。

echo join(", ", $list);