Language::listToText() uses for(;;) which assumes the index in a list
starts at 0 and following keys are consecutive integers.
This assumption fails (and results in warnings with E_STRICT) when
SpecialListGroupRights::formatPermissions() uses the key-preserving
array_intersect() to create a subset of $allGroups.
Bug: T199559
Change-Id: I4eb03a95509d69653156a2764d58c0c5d0d1dfbc
* Take a list of strings and build a locale-friendly comma-separated
* list, using the local comma-separator message.
* The last two strings are chained with an "and".
* Take a list of strings and build a locale-friendly comma-separated
* list, using the local comma-separator message.
* The last two strings are chained with an "and".
- * NOTE: This function will only work with standard numeric array keys (0, 1, 2…)
+ * @param string[] $list
- function listToText( array $l ) {
- $m = count( $l ) - 1;
- if ( $m < 0 ) {
+ public function listToText( array $list ) {
+ $itemCount = count( $list );
+ if ( $itemCount < 1 ) {
+ $text = array_pop( $list );
+ if ( $itemCount > 1 ) {
$and = $this->msg( 'and' )->escaped();
$space = $this->msg( 'word-separator' )->escaped();
$and = $this->msg( 'and' )->escaped();
$space = $this->msg( 'word-separator' )->escaped();
+ $comma = '';
+ if ( $itemCount > 2 ) {
$comma = $this->msg( 'comma-separator' )->escaped();
}
$comma = $this->msg( 'comma-separator' )->escaped();
}
+ $text = implode( $comma, $list ) . $and . $space . $text;
- $s = $l[$m];
- for ( $i = $m - 1; $i >= 0; $i-- ) {
- if ( $i == $m - 1 ) {
- $s = $l[$i] . $and . $space . $s;
- } else {
- $s = $l[$i] . $comma . $s;
- }
- }
- return $s;