Задача
Необходимо распечатать массив с запятыми, разделяющими элементы, и со строкой «and» перед последним элементом, если в массиве больше двух элементов.
Решение
Используйте функцию pc_array_to_comma_string(), показанную в примере 4.1, которая возвращает правильную строку.
Пример 4.1. 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; однако свойство транзитивности не действует, поэтому нельзя применить код по умолчанию к одноэлементным массивам.