I have an array of items:
array(
'apples',
'oranges',
'pineapples'
)
that I would like to format like so: "Some of my favorite fruits are apples
, oranges
and pineapples
"
So, using PHP
I would like to be able to transform that array into a reader friendly apples, oranges and pineapples
.
At first I thought I might be able to use array_map
but i'm not sure how I would go about telling what the last and 2nd to last items are (it's easy to add a ,
after each item with array_map
, however you wouldn't want a comma before the last item)
Thoughts?
Divide the problem to conquer it: Take out the last element, create the comma separated list and then add the last element.
$array = array(
'apples',
'oranges',
'pineapples'
);
$last = array_pop($array);
echo implode(', ', $array), ' and ', $last; # apples, oranges and pineapples
Naturally this only makes sense when there are at least two values in the array. Functions used: implode
Docs (probably more suitable than array_map
in this case) and array_pop
Docs.
On the other hand, if the values do not contain any ,
you can first create a comma separated string with the implode
function and then use a regular expression to replace the last comma with and
.
That done will also work on arrays that have less than 2 elements. I do this in a loop that removes one element from the array in each step so that it shows how it behaves:
$array = array(
'apples',
'oranges',
'pineapples'
);
foreach($array as $v)
{
echo preg_replace('(,([^,]*)$)', ' and$1', implode(', ', $array)), "
";
array_pop($array);
}
Output:
apples, oranges and pineapples
apples and oranges
apples
Perhaps your looking for implode, which will essentially turn an array to string
You can know which one is the last element by counting them:
$array = array(
'apples',
'oranges',
'pineapples'
);
$count= count($array);
// because the key start from 0 , we must subtract 1
$lastKey= $count-1;
/// now u can do that
echo "<br>1st :".$array[0];
echo "<br>2nd :".$array[1];
echo "<br>3rd :".$array[2];
echo "<br>last:".$array[$lastKey];
// or same as u like
foreach($array as $key=>$value){
echo $value;
if($key == $lastKey){
echo ".";
}elseif($key == ($lastKey-1)){
echo " and ";
}else{
echo " , ";
}
}
Ok, so as others have commented implode
is a solution.
I would probably end up using a combination of implode
, strripos
and substr_replace
:
$string = implode(', ', $fruit);
$pos = strripos($string, ', ');
echo substr_replace($string, ' and ', $pos, 2);
which results in apples, oranges and pineapples
.
I'd gladly post a more elegant solution if I could think of one, but this is a quick and easy way to get at the change you need.