Je ne suis pas sûr qu'un "one liner" soit la solution la plus élégante à ce problème.
J'ai écrit ceci il y a un certain temps et je l'ajoute au besoin :
/**
* 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;
}
Vous n'êtes pas obligé d'utiliser "et" comme chaîne de jonction, c'est efficace et cela fonctionne avec un nombre d'éléments compris entre 0 et un nombre illimité :
// 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'));
Il est facile à modifier pour inclure une virgule d'Oxford si vous le souhaitez :
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;
}
4 votes
Pourquoi ne pas couper le dernier élément du tableau avant de faire imploser le reste ? Et puis juste .= concenre votre chaîne.