Необходимо распечатать массив с запятыми, разделяющими элементы, и со строкой «and» перед последним элементом, если в массиве больше двух элементов.
Используйте функцию pc_array_to_comma_string(), показанную в примере описанном ниже, которая возвращает правильную строку.
function pc_array_to_comma_string($array) {
switch (count($array)) {
case 0:
return ' ';
case 1:
return reset($array);
case 2:
return join(' and ', $array);
default:
$last = array_pop($array);
return join(', ', $array) . ", and $last";
}
}
Если необходимо распечатать список элементов, то нелишне печатать их в корректном с точки зрения грамматики стиле. Неуклюже выглядит на экране текст, подобный следующему:
$thundercats = array('Lion-O', 'Panthro', 'Tygra', 'Cheetara', 'Snarf');
print 'ThunderCat good guys include ' . join(', ', $thundercats) . '.';
ThunderCat good guys include Lion-O, Panthro, Tygra, Cheetara, Snarf.
Такая реализация этой функции не совсем то, что нужно, так как мы
хотели, чтобы функция pc_array_to_comma_string() работала со всеми
массивами, а не только с числовыми, начинающимися с 0. Если она
ограничивается только этим подмножеством, то для одноэлементного
массива вернет $array[0]. Но если массив начинается не с 0, то элемент
$array[0] пустой. Поэтому можно использовать тот факт, что функция
reset(), которая сбрасывает внутренний указатель массива, также возвращает значение первого элемента массива.
По сходной причине для извлечения последнего элемента вызывается
функция array_pop() вместо представления его в виде $array[count($array)-1]. Это позволяет использовать функцию join() для массива $array.
Также обратите внимание, что код в case 2 приведенного выше оператора switch в действительности также корректно работает и в case 1.
А код в default работает (хотя и неэффективно) в case 2; однако свойство транзитивности не действует, поэтому нельзя применить код по умолчанию к одноэлементным массивам.