在典型的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);
执行(另请参阅implode
PHP手册(。
如果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);