Создайте строку, разделенную запятыми, из одного столбца массива объектов

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

Моя петля очень проста, как показано ниже

foreach($results as $result){
  echo $result->name.',';
}

Что отзывается эхом

result,result,result,result,

Мне просто нужно убить эту надоедливую последнюю запятую.


person Cecil    schedule 16.01.2011    source источник


Ответы (12)


Сначала получите весь вывод, используя буферизацию вывода. Затем обрежьте запятую и отобразите ее. Итак, сделайте это так:

ob_start();
foreach($results as $result)
{
   echo $result->name.',';
}
$output = ob_get_clean();

echo rtrim($output, ',');

Метод буферизации вывода помогает, если внутренний цикл очень большой (и OP публикует здесь только для краткости), тогда использовать OB проще без изменения внутренней части цикла.

person shamittomar    schedule 16.01.2011
comment
Нет необходимости в OB, просто создайте строку, обрежьте, а затем выполните эхо. - person BoltClock; 16.01.2011
comment
@BoltClock: да, но если внутренний цикл очень большой (и OP публикует здесь только для краткости), то использовать OB проще без изменения внутренних компонентов. Спасибо за +1. - person shamittomar; 16.01.2011

Лучше:

$resultstr = array();
foreach ($results as $result) {
  $resultstr[] = $result->name;
}
echo implode(",",$resultstr);
person LeleDumbo    schedule 16.01.2011

1. Concat в строку, но добавьте | перед

$s = '';
foreach ($results as $result) { 
    if ($s) $s .= '|';
    $s .= $result->name; 
}
echo $s;

2. Отображать | только если не последний элемент

$s = '';
$n = count($results);
foreach ($results as $i => $result) { 
    $s .= $result->name;
    if (($i+1) != $n) $s .= '|';
}
echo $s;

3. Загрузить в массив, а затем взорвать

$s = array();
foreach ($results as $result) { 
    $s[] = $result->name;
}
echo implode('|', $s);

4. Concat в строку, затем вырезать последний | (или rtrim его)

$s = '';
foreach ($results as $result) { 
    $s .= $result->name . '|';
}
echo substr($s, 0, -1); # or # echo rtrim($s, '|');

5. Concat строка с использованием array_map()

echo implode('|', array_map(function($result) { return $result->name; }, $results));
person Glavić    schedule 26.10.2014
comment
Строка Concat с использованием array_map - лучшая - person Faizan Anwer Ali Rupani; 16.07.2019

Недавно у меня была такая же проблема с этой похожей проблемой. Я исправил это, используя переменную приращения $ i, инициализировав ее значением 0, а затем увеличив ее внутри цикла foreach. В этом цикле поместите if, else с оператором echo, включая запятую, если счетчик $ i меньше, чем оператор sizeof () вашего массива / переменной.

Я не знаю, решит ли это вашу проблему как таковую, но мне это помогло. Я понимаю, что этому вопросу много лет, но, надеюсь, это поможет кому-то другому. Я новичок в PHP, поэтому я не совсем понял многие ответы, которые были даны до меня, хотя они были довольно проницательными, особенно взрывающийся.

$i=0;
foreach ($results as $result) {
    $i++;
    if(sizeof($results) > $i) {
        echo $result . ", ";
    } else {
        echo $result;
    }
}
person jrgresh92    schedule 14.07.2018

В современном PHP array_column() позволяет изолировать столбец данных в массиве объектов.

Код: (Демо)

$results = [
    (object)['name' => 'A'],
    (object)['name' => 'B'],
    (object)['name' => 'C']
];

echo implode(',', array_column($results, 'name'));

Вывод:

A,B,C

Тем не менее, поскольку вы выполняете итерацию набора результатов, вам может быть удобнее вызывать функцию CONCAT() в вашем sql, чтобы значения уже были объединены в набор результатов с одним значением.

person mickmackusa    schedule 13.09.2020

Не так красиво, но тоже работает:

$first=true;
foreach($results as $result){
    if(!$first) { echo ', '; }
    $first=false;
    echo $result->name;
}
person Alex Russell    schedule 18.08.2015
comment
Это пропускает только запятую в первом элементе. Вопрос по последнему пункту. - person MarsAndBack; 30.01.2019

Еще один умный способ:

foreach($results as $result){
  echo ($passed ? ',' : '') . $result->name;
  $passed = true;
}

В этом случае сначала цикл $passed равен NULL, а , не печатает.

person Amir Fo    schedule 24.02.2018

Я знаю, что это старый поток, но он появился недавно, и я подумал, что поделюсь своим альтернативным, более чистым способом борьбы с ним, используя next ().

$array = array("A thing", "A whatsit", "eighty flange oscillators");
          
foreach( $array as $value ){
    echo $value;
    $nxt = next($array);
    if($nxt) echo ", "; // commas between each item in the list
    else echo ". And that's it."; // no comma after the last item.
}

// outputs: 
// A thing, A whatsit, eighty flange oscillators. And that's it.

поиграйте с ним здесь

person Alex Russell    schedule 15.02.2021

Мне приходится делать это много, потому что я всегда пытаюсь ввести числа в jplot, мне легче поставить запятую перед циклом, например так:

foreach($arrayitem as $k){ $string =  $string.",".$k;
 } 

а затем отрежьте первый символ (запятую) с помощью substr, это поможет, если вы знаете, что предполагаемая длина вашей строки будет, я не уверен, каков предел для символа substr max.

 echo substr($a,1,10000000);

надеюсь это поможет.

person Binxalot    schedule 13.05.2012

Я обычно так и делаю: ставлю запятую перед элементом, а не после, игнорируя первый цикл.

$i = 0;
$string = '';

foreach($array as $item){
    $string .= ($i++ ? ',' : '').$item;
}
person lugreen    schedule 26.08.2020

person    schedule
comment
Это убило бы каждую запятую в цикле, не так ли? ... не только в самом конце выводимой строки? - person Cecil; 16.01.2011
comment
Я отредактировал фрагмент после того, как понял, что это эхо внутри цикла. - person Mike; 16.01.2011

person    schedule
comment
Что делать, если массив не имеет числового индекса? - person kapa; 27.09.2012
comment
Это хорошая идея - описывать, что вы делаете, только публикация кода может сбивать с толку. - person Kao; 27.09.2012
comment
Добро пожаловать в StackOverflow. Рассмотрите возможность пояснения любого кода, который вы предоставляете. Это позволит вопрошающему извлечь уроки из ваших примеров. См. FAQ по написанию хороших ответов . - person Joseph Mansfield; 27.09.2012