Как в PHP создать список, разделенный запятыми, из массива?


113

Я знаю, как перебирать элементы массива с помощью foreach и добавлять запятую, но всегда больно убирать последнюю запятую. Есть ли простой способ сделать это с помощью PHP?

$fruit = array('apple', 'banana', 'pear', 'grape');

В конечном итоге я хочу

$result = "apple, banana, pear, grape"

Ответы:


231

Вы хотите использовать для этого implode .

то есть: $commaList = implode(', ', $fruit);


Есть способ добавлять запятые, не ставя запятую в конце. Вы бы захотели сделать это, если вам нужно одновременно проделать какие-то другие манипуляции. Например, вы хотите процитировать каждый фрукт, а затем разделить их запятыми:

$prefix = $fruitList = '';
foreach ($fruits as $fruit)
{
    $fruitList .= $prefix . '"' . $fruit . '"';
    $prefix = ', ';
}

Кроме того, если вы просто делаете это «обычным» способом, добавляя запятую после каждого элемента (как будто вы это делали раньше), и вам нужно обрезать последний, просто сделайте это $list = rtrim($list, ', '). Я вижу, как многие люди без надобности возятся substrв этой ситуации.


4
Было бы разумнее (при попытке добавить кавычки) вызвать <code> $ fruitlist = '"'. Implode ('", "', $ fruit). '"'; </code>
cwallenpoole

Цикл foreach лучше, если вы хотите манипулировать этими данными в массиве перед преобразованием их в строку; Например, добавляет косые черты или mysql_real_escape_string.
Naphtali Gilead

39

Вот как я это делал:

$arr = array(1,2,3,4,5,6,7,8,9);

$string = rtrim(implode(',', $arr), ',');

echo $string;

Вывод:

1,2,3,4,5,6,7,8,9

Живая демонстрация: http://ideone.com/EWK1XR

РЕДАКТИРОВАТЬ: в комментарии @joseantgv вы сможете удалить rtrim()из приведенного выше примера. То есть:

$string = implode(',', $arr);

5
Как было сказано выше, вы могли бы просто сделать implode (',', $ arr)
joseantgv 01

@joseantgv Вы правы, я не знаю, зачем использую rtrim(). Я помню, что у меня возникла проблема с лишними запятыми в конце строки, но я не могу вспомнить ситуацию, в которой это происходило.
Nate

6

Результат с andв итоге:

$titleString = array('apple', 'banana', 'pear', 'grape');
$totalTitles = count($titleString);
if ($totalTitles>1) {
    $titleString = implode(', ', array_slice($titleString, 0, $totalTitles-1)) . ' and ' . end($titleString);
} else {
    $titleString = implode(', ', $titleString);
}

echo $titleString; // apple, banana, pear and grape

3

Аналогично ответу Ллойда, но работает с массивом любого размера.

$missing = array();
$missing[] = 'name';
$missing[] = 'zipcode';
$missing[] = 'phone';

if( is_array($missing) && count($missing) > 0 )
        {
            $result = '';
            $total = count($missing) - 1;
            for($i = 0; $i <= $total; $i++)
            { 
              if($i == $total && $total > 0)
                   $result .= "and ";

              $result .= $missing[$i];

              if($i < $total)
                $result .= ", ";
            }

            echo 'You need to provide your '.$result.'.';
            // Echos "You need to provide your name, zipcode, and phone."
        }

3

Я предпочитаю использовать оператор IF в цикле FOR, который проверяет, не является ли текущая итерация последним значением в массиве. Если нет, добавьте запятую

$fruit = array("apple", "banana", "pear", "grape");

for($i = 0; $i < count($fruit); $i++){
    echo "$fruit[$i]";
    if($i < (count($fruit) -1)){
      echo ", ";
    }
}

2
если общее количество просто отличается от 4?
Jyothish

1

Иногда вам даже не нужен php для этого в определенных случаях (например, элементы списка находятся в собственном общем теге при рендеринге). Вы всегда можете добавить запятые ко всем элементам, кроме последнего дочернего, через css, если они являются отдельными элементами после рендеринга из сценария.

Я часто использую это в базовых приложениях, чтобы сократить количество произвольного кода:

.likers a:not(:last-child):after { content: ","; }

В основном смотрит на элемент, ориентируется на все, кроме последнего элемента, и после каждого элемента добавляет запятую. Это просто альтернативный способ вообще не использовать скрипт, если это применимо.



0

Функциональное решение будет выглядеть так:

$fruit = array('apple', 'banana', 'pear', 'grape');
$sep = ','; 

array_reduce(
    $fruits,
    function($fruitsStr, $fruit) use ($sep) {
        return (('' == $fruitsStr) ? $fruit : $fruitsStr . $sep . $fruit);
    },
    ''
);

0

Следуй за этим

$teacher_id = '';

        for ($i = 0; $i < count($data['teacher_id']); $i++) {

            $teacher_id .= $data['teacher_id'][$i].',';

        }
        $teacher_id = rtrim($teacher_id, ',');
        echo $teacher_id; exit;

-1

Если вы делаете цитируемые ответы, вы можете сделать

$commaList = '"'.implode( '" , " ', $fruit). '"';

приведенное выше предполагает, что фрукт не равен нулю. Если вы не хотите делать это предположение, вы можете использовать оператор if-then-else или тернарный оператор (? :).


-2

Другой способ мог быть таким:

$letters = array("a", "b", "c", "d", "e", "f", "g");

$result = substr(implode(", ", $letters), 0, -3);

Результатом $resultявляется красиво отформатированный список, разделенный запятыми.

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

-2
$letters = array("a", "b", "c", "d", "e", "f", "g"); // this array can n no. of values
$result = substr(implode(", ", $letters), 0);
echo $result

вывод-> a, b, c, d, e, f, g

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.