在典型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 ',';
}
但是这为简单的事情添加了四条代码......
答案 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)
答案 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);