用“,”内爆数组并在最后一项之前添加“和”

新手上路,请多包涵

这个数组包含一个项目列表,我想把它变成一个字符串,但我不知道如何让最后一个项目在它之前有一个 &/and 而不是一个逗号。

 1 => coke 2=> sprite 3=> fanta

应该成为

coke, sprite and fanta

这是常规的内爆函数:

 $listString = implode(', ', $listArrau);

有什么简单的方法可以做到这一点?

原文由 lisovaccaro 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 256
2 个回答

适用于任意数量物品的长衬里:

 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 语句。而且它恰好可以折叠成单层。

原文由 deceze 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不确定一个衬里是解决这个问题的最优雅的方法。

我刚才写了这个并根据需要将其放入:

 /**
 * 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;
}

原文由 Angry Dan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏