PHP / JS: удаление последней запятой в списке с разделителями - PullRequest
0 голосов
/ 17 июля 2011

Каков наилучший, самый лаконичный метод кодирования для устранения окончательной запятой при генерации списка с разделителями-запятыми в типичном цикле 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 ]

5 голосов
/ 17 июля 2011

Стандартная * 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'
4 голосов
/ 17 июля 2011

Если вы не упростили пример кода:

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() ? ',' : '';
}
2 голосов
/ 17 июля 2011
echo implode(",", $list);

без использования foreach необходимо

1 голос
/ 17 июля 2011

Пользователь implode () функция для достижения этой цели. Иногда также необходимо что-то сложить, например, заключить в кавычки значения полей SQL:

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

А для JavaScript используйте Array.join() метод ( W3C ):

var implodedString = someArray.join(',')
1 голос
/ 17 июля 2011

Почему бы и нет:

echo implode(",", $list);

1 голос
/ 17 июля 2011

если я вас правильно понял, вы можете использовать функцию implode .Это сделает работу за вас.

BR,

TJ

0 голосов
/ 17 июля 2011

Распространенная практика: использование функции соединения или ее аналога.Эта функция существует почти на каждом языке, поэтому это наиболее простой, понятный и независимый от среды подход.

echo join(", ", $list);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...