24

I'm trying to add a newline \n, in my foreach statement with implode.

My code:

$ga->requestReportData($profileId,array('country'),array('visits')); 
$array = array();
foreach($ga->getResults() as $result){ 
    $array[] = "['".$result->getcountry()."', ".$result->getVisits()."]"; 
} 
echo implode(",\n", $array);

I only get a comma and a space between my results. I want a comma and a newline.

I am trying to get something like this:

['Country', 'number'],

['Country', 'number'],

['Country', 'number']

However I I get this:

['Country', 'number'], ['Country', 'number'], ['Country', 'number']

Why does my \n not cause a newline?

Community
  • 1
  • 1
Mathieu
  • 797
  • 2
  • 6
  • 24

4 Answers4

31

I suspect it is because you are echoing the data to the browser and it's not showing the line break as you expect. If you wrap your implode in the the <pre> tags, you can see it is working properly.

Additionally, your arguments are backwards on your implode function, according to current documentation. However, for historical reasons, parameters can be in either order.

$array = array('this','is','an','array');
echo "<pre>".implode(",\n",$array)."</pre>";

Output:

this,
is,
an,
array
Andy
  • 49,085
  • 60
  • 166
  • 233
  • 2
    Have a look at the docs: `implode() can, for historical reasons, accept its parameters in either order. For consistency with explode(), however, it may be less confusing to use the documented order of arguments.` – kelunik Feb 05 '14 at 17:38
  • 1
    Is there any option without `
    ` tag
    – Kiran Reddy Feb 05 '17 at 08:01
27

For cross-platform-compatibility use PHP_EOL instead of \n.

Using the example from the accepted answer above:

$array = array('this','is','another','way');
echo "<pre>".implode(PHP_EOL, $array)."</pre>";

If you're writing directly to HTML (it wouldn't work on files) there is an option of using <br> like this:

$array = array('this','is','another','way');
echo "<p>".implode(<br>, $array)."</p>";

Both output:

this, 
is, 
another, 
way
boroboris
  • 1,548
  • 1
  • 19
  • 32
4

This can also work

$array = array('one','two','three','four');
echo implode("<br>", $array);

Output:

one
two
three
four
B.K
  • 847
  • 10
  • 6
-1

Many others claim you use the wrong order, that's only partial right, because the docs only recommend this, but you don't have to:

implode() can, for historical reasons, accept its parameters in either order. For consistency with explode(), however, it may be less confusing to use the documented order of arguments.

I think your problem is caused by how browsers interpret HTML. They don't care about newlines, they're like a normal space for them.

To show these linebreaks, you can use <pre><?php echo implode($glue, $array); ?></pre>. You could also use nl2br(implode(..)) or nl2br(implode(..), true) if you're writing XHTML.

kelunik
  • 6,750
  • 2
  • 41
  • 70