'Create a comma-separated string from a single column of an array of objects

I'm using a foreach loop to echo out some values from my database, I need to strip the last comma from the last loop if that makes sense.

My loop is just simple, as below

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

Which echos out

result,result,result,result,

I just need to kill that pesky last comma.



Solution 1:[1]

Better:

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

Solution 2:[2]

1. Concat to string but add | before

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

2. Echo | only if not last item

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

3. Load to array and then implode

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

4. Concat to string then cut last | (or rtrim it)

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

5. Concat string using array_map()

echo implode('|', array_map(function($result) { return $result->name; }, $results));

Solution 3:[3]

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

Solution 4:[4]

I've been having the same issue with this similar problem recently. I fixed it by using an increment variable $i, initializing it to 0, then having it increment inside the foreach loop. Within that loop place an if, else, with the echo statement including a comma if the $i counter is less than the sizeof() operator of your array/variable.

I don't know if this would fix your issue per se, but it helped me with mine. I realize this question is years-old, but hopefully this will help someone else. I'm fairly new to PHP so I didn't quite understand a lot of the Answers that were given before me, though they were quite insightful, particularly the implode one.

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

Solution 5:[5]

In modern PHP, array_column() will allow you to isolate a column of data within an array of objects.

Code: (Demo)

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

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

Output:

A,B,C

That said, since you are iterating a result set, then you may be better served by calling a CONCAT() function in your sql, so that the values are already joined in the single value result set.

Solution 6:[6]

$arraySize = count($results);
for($i=0; $i<$arraySize; $i++)
{
  $comma = ($i<$arraySize) ? ", " : "";
  echo $results[$i]->name.$comma;
}

Solution 7:[7]

Not as pretty, but also works:

$first=true;
foreach($results as $result){
    if(!$first) { echo ', '; }
    $first=false;
    echo $result->name;
}

Solution 8:[8]

Another smart way is:

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

In this case at first loop $passed is NULL and , doesn't print.

Solution 9:[9]

I know this is an old thread, but this came up recently and I thought I'd share my alternate, cleaner way of dealing with it, using 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.

play with it here

Solution 10:[10]

I have to do this alot because I'm always trying to feed numbers in to jplot, I find its easier to put the comma in the front of the loop like so:

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

and then chop off the first character (the comma) using substr, it helps if you know a guestimate of long your string will be, I'm not sure what the limit on substr max character is.

 echo substr($a,1,10000000);

hope this helps.

Solution 11:[11]

$a[0] = 'John Doe';       
$a[1] = 'Jason statham';       
$a[2] = 'Thomas Anderson';
$size = count($a);
foreach($a as $key=>$name){
    $result .= $name;
    if($size > $key+1) $result .=', ';
}
echo $result;

Solution 12:[12]

<?php
$return = array(any array)
$len = count($return);
$str = '';
$i = 1;
foreach($return as $key=>$value)
{
    $str .= '<a href='.$value['cat_url'].'>'.$value['cat_title'].'</a>';
    if($len > $i)
    {
        $str .= ',';
        $i = $i+1;
    }
}
echo $str;
?>

Solution 13:[13]

<?php
$i = 1;
$count = count( $results );
foreach( $results as $result ) {
    echo $result->name;
    if ( $i < $count ) echo ", ";                               
    ++$i;
}
?>

Solution 14:[14]

This is what I normally do, add a comma before the item rather than after, while ignoring the first loop.

$i = 0;
$string = '';

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