A PHP snippet for pluralizing strings
Every time I'm working on CRUD applications it seems like a lot of boilerplate code goes towards displaying appropriate messages when lists can contain zero, one or more than one element. I put together a quick function to speed up the process.
The function takes a string with string fragments marked up inline as its main argument. It then formats the output based on the count passed into the function.
function pluralize($text, $count = 0) {
$regex = '/\[(.*?)\]/';
$divider = '|';
// If there are no end braces [] use whole input as option list.
if (preg_match($regex, $text, $matches)) {
$search = $matches[0];
$fragments = explode($divider, $matches[1]);
} else {
$search = $text;
$fragments = explode($divider, $text);
}
// We accept one (which is pointless...), two or three inline text fragments.
// If we've been given just two then case for zero should be same as two or more.
if (count($fragments) == 1) {
$fragments = array($fragments[0], $fragments[0], $fragments[0]);
} else if (count($fragments) == 2) {
$fragments = array($fragments[1], $fragments[0], $fragments[1]);
}
// Normalize count.
// If value is array then use the number of elements as count.
if (intval($count) <= 0) {
$count = 0;
} else if (is_array($count)) {
$count = count($count);
}
// Choose the appropriate text fragment.
if ($count <= 1) {
$replace = $fragments[$count];
} else {
$replace = $fragments[2];
}
// Replace markup with chosen option.
$text = str_replace($search, $replace, $text);
// Place our count into output (allows user to put %d inline to get count).
$text = str_replace('%d', number_format($count), $text);
return $text;
}
The tests show example usage.
$input = "There [are no pages|is 1 page|are %d pages]";
assert(pluralize($input, 0) == 'There are no pages');
assert(pluralize($input, -1) == 'There are no pages');
assert(pluralize($input, 1) == 'There is 1 page');
assert(pluralize($input, 2) == 'There are 2 pages');
assert(pluralize($input, 1000) == 'There are 1,000 pages');
assert(pluralize($input, null) == 'There are no pages');
assert(pluralize($input, array(1, 2, 3)) == 'There are 3 pages');
$input = "1 page|%d pages";
assert(pluralize($input, 0) == '0 pages');
assert(pluralize($input, 1) == '1 page');
I am releasing this into the public domain so feel free to copy and redistribute the code.