Решение Minitech с самого начала является элегантным, за исключением одной небольшой проблемы, его вывод приведет к:
var_dump(makeList(array('a', 'b', 'c'))); //Outputs a, b and c
Но правильное форматирование этого списка (для обсуждения) должно быть; а, б и в. В его реализации к атрибуту, следующему за последним, никогда не будет добавлен ',', потому что срез массива обрабатывает его как последний элемент массива, когда он передается implode()
.
Вот реализация, которая у меня была, и правильно (опять же, для обсуждения) форматирует список:
class Array_Package
{
public static function toList(array $array, $conjunction = null)
{
if (is_null($conjunction)) {
return implode(', ', $array);
}
$arrayCount = count($array);
switch ($arrayCount) {
case 1:
return $array[0];
break;
case 2:
return $array[0] . ' ' . $conjunction . ' ' . $array[1];
}
// 0-index array, so minus one from count to access the
// last element of the array directly, and prepend with
// conjunction
$array[($arrayCount - 1)] = $conjunction . ' ' . end($array);
// Now we can let implode naturally wrap elements with ','
// Space is important after the comma, so the list isn't scrunched up
return implode(', ', $array);
}
}
// You can make the following calls
// Minitech's function
var_dump(makeList(array('a', 'b', 'c')));
// string(10) "a, b and c"
var_dump(Array_Package::toList(array('a', 'b', 'c')));
// string(7) "a, b, c"
var_dump(Array_Package::toList(array('a', 'b', 'c'), 'and'));
string(11) "a, b, and c"
var_dump(Array_Package::toList(array('a', 'b', 'c'), 'or'));
string(10) "a, b, or c"
Ничего против другого решения, просто хотел поднять этот вопрос.