Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Comma separated list from array with "and" before last element

Tags:

arrays

php

I have an array ($number_list) that has a dynamically generated list of values. There will be at least 1 value in the array and no more than 4.

Currently, I have a nice way of having a comma separated list using this...

$comma_list = implode(', ', $number_list);

However, I'd like to keep with English convention and have the word "and" before the last element. So, let's say $number_list contains the values 4, 5, 6, 7. I would want to echo a statement like, "The list is 4, 5, 6, and 7."

Any ideas how to get that and in there?

like image 681
gtilflm Avatar asked Aug 27 '13 22:08

gtilflm


3 Answers

Remove the last element from the list, implode what's left with commas and then concatenate "and last_element":

$last = array_pop($number_list);
$output = implode(', ', $number_list);
if ($output) {
    $output .= ', and ';
}
$output .= $last;

If you prefer, you can also write the above more tersely as

$last = array_pop($number_list);
$output = $number_list
    ? implode(', ', $number_list).', and '.$last
    : $last;

Update:

I have to admit I initially misread the question and thought that it was about replacing the last comma with "and", not adding an "and" before the final item. I have since edited the answer to target the latter scenario. Note that the code can be easily adapted to do either by selecting " and " or ", and " for the "glue" string respectively.

like image 52
Jon Avatar answered Nov 15 '22 23:11

Jon


Try array_pop() to get the last element, then array_push to modify and push the element back:

http://php.net/manual/en/function.array-pop.php

Something like

$last_element = array_pop($number_list);
array_push($number_list, 'and '.$last_element);

Then you can do your implode:

$comma_list = implode(', ', $number_list);
like image 23
ChunkyBaconPlz Avatar answered Nov 15 '22 21:11

ChunkyBaconPlz


If the list has at least two elements at the end, you can implode them with " and " (or if your question wasn't borked ", and ") already.

Then you implode the whole array with ", ".

  • http://php.net/array_splice

Example:

<?php

$numbers = range(1, 4);

array_splice($numbers, -2, 2, implode(' and ', array_slice($numbers, -2)));

echo implode(', ', $numbers); prints "1, 2, 3 and 4"

Demo: https://3v4l.org/DHPla

like image 20
hakre Avatar answered Nov 15 '22 23:11

hakre