用“, ” 内爆数组,并在最后一项之前添加“and”
这个数组包含一个项目列表,我想把它变成一个字符串,但我不知道如何让最后一个项目有一个&/and,而不是逗号。
1 => coke 2=> sprite 3=> fanta
应该成为
coke, sprite and fanta
这是正则内爆函数:
$listString = implode(', ', $listArrau);
什么是简单的方法?
这个数组包含一个项目列表,我想把它变成一个字符串,但我不知道如何让最后一个项目有一个&/and,而不是逗号。
1 => coke 2=> sprite 3=> fanta
应该成为
coke, sprite and fanta
这是正则内爆函数:
$listString = implode(', ', $listArrau);
什么是简单的方法?
适用于任意数量项目的长线:
echo join(' and ', array_filter(array_merge(array(join(', ', array_slice($array, 0, -1))), array_slice($array, -1)), 'strlen'));
或者,如果您真的更喜欢冗长:
$last = array_slice($array, -1);
$first = join(', ', array_slice($array, 0, -1));
$both = array_filter(array_merge(array($first), $last), 'strlen');
echo join(' and ', $both);
关键是这种切片,合并,过滤和联接可以正确处理所有情况,包括0,1和2项,而无需额外的语句。它碰巧可以折叠成一行。if..else
我不确定一个衬垫是解决这个问题的最优雅的解决方案。
我不久前写了这篇文章,并根据需要将其放入:
/**
* Join a string with a natural language conjunction at the end.
* https://gist.github.com/angry-dan/e01b8712d6538510dd9c
*/
function natural_language_join(array $list, $conjunction = 'and') {
$last = array_pop($list);
if ($list) {
return implode(', ', $list) . ' ' . $conjunction . ' ' . $last;
}
return $last;
}
您不必使用“and”作为连接字符串,它很有效,并且可以处理从0到无限数量的项目:
// null
var_dump(natural_language_join(array()));
// string 'one'
var_dump(natural_language_join(array('one')));
// string 'one and two'
var_dump(natural_language_join(array('one', 'two')));
// string 'one, two and three'
var_dump(natural_language_join(array('one', 'two', 'three')));
// string 'one, two, three or four'
var_dump(natural_language_join(array('one', 'two', 'three', 'four'), 'or'));
如果需要,可以很容易地修改以包含牛津逗号:
function natural_language_join( array $list, $conjunction = 'and' ) : string {
$oxford_separator = count( $list ) == 2 ? ' ' : ', ';
$last = array_pop( $list );
if ( $list ) {
return implode( ', ', $list ) . $oxford_separator . $conjunction . ' ' . $last;
}
return $last;
}