我想为除最后一项之外的所有项目添加逗号。最后一个必须有“和”。
第1项,第2项和第3项
但是项目可以是1 +
所以,如果1项:
第1项
如果有2个项目:
第1项和第2项
如果有3个项目:
第1项,第2项和第3项
如果有4个项目:
第1项,第2项,第3项和第4项
等等。
答案 0 :(得分:10)
这是一个功能;只是传递数组。
function make_list($items) {
$count = count($items);
if ($count === 0) {
return '';
}
if ($count === 1) {
return $items[0];
}
return implode(', ', array_slice($items, 0, -1)) . ' and ' . end($items);
}
答案 1 :(得分:2)
minitech的解决方案一开始就很优雅,除了一个小问题,他的输出将导致:
var_dump(makeList(array('a', 'b', 'c'))); //Outputs a, b and c
但是这个清单的适当格式(争论不休)应该是; a,b和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"
没有什么可以反对其他解决方案,只是想提出这一点。
答案 2 :(得分:1)
你可以用逗号破坏X - 1项目,并用“和”添加最后一项。
答案 3 :(得分:1)
你可以这样做:
$items = array("Item 1", "Item 2", "Item 3", "Item 4");
$item = glueItems($items);
function glueItems($items) {
if (count($items) == 1) {
$item = implode(", ", $items);
} elseif (count($items) > 1) {
$last_item = array_pop($items);
$item = implode(", ", $items) . ' and ' . $last_item;
} else {
$item = '';
}
return $item;
}
echo $item;
答案 4 :(得分:0)
如果它是一个数组,只需使用implode(...)
示例:
$items = array("Item 1", "Item 2", "Item 3", "Item 4");
$items[count($items) - 1] = "and " . $items[count($items) - 1];
$items_string = implode(", ", $items);
echo $items_string;
答案 5 :(得分:0)
这是一个变体,可以选择支持有争议的Oxford Comma,并为连词(和/或)采用参数。请注意两个项目的额外检查;在这种情况下,甚至牛津的支持者都不会使用逗号。
function conjoinList($items, $conjunction='and', $oxford=false) {
$count = count($items);
if ($count === 0){
return '';
} elseif ($count === 1){
return $items[0];
} elseif ($oxford && ($count === 2)){
$oxford = false;
}
return implode(', ', array_slice($items, 0, -1)) . ($oxford? ', ': ' ') . $conjunction . ' ' . end($items);
}