PHP для формирования строки типа "A, B, C и D" из значений массива
Учитывая следующий массив:
Array
(
[143] => Car #1
[144] => Car #2
[145] => Car #3
)
Я в настоящее время использую это
implode(', ', array_values($car_names))
генерировать строку как
Автомобиль № 1, Автомобиль № 2, Автомобиль № 3
Я хотел бы получить что-то вроде
Автомобиль № 1, Автомобиль № 2 и Автомобиль № 3
Идея заключалась бы в том, чтобы вставить "и" между двумя последними элементами массива.
Если массив содержит две пары ключ / значение (например, у пользователя 2 машины), запятых не будет.
Автомобиль № 1 и Автомобиль № 2
И если массив содержит один ключ / значение (например, у пользователя есть 1 автомобиль)
Автомобиль № 1
Любое предложение, как это сделать? Я пытался с помощью array_splice
но я не уверен, что это путь (т.е. вставка нового элемента в массив).
Спасибо за помощь!
7 ответов
Я думаю, что вы, вероятно, хотите что-то подобное, используя array_pop
чтобы получить последний элемент от конца массива. Затем вы можете взорвать оставшуюся часть массива и добавить последний элемент произвольным образом:
$last_value = array_pop($car_names);
$output = implode(', ', array_values($car_names));
$output .= ($output ? ' and ' : '') . $last_value;
Изменить: добавлен условный, чтобы проверить, если массив был только один элемент.
$last = array_pop($car_names);
echo implode(', ', $car_names) . ' AND ' . $last;
Это решение немного длиннее, но протестировано для всех размеров массивов и является полным решением. Кроме того, он не изменяет массив, как указано выше, и разделяется на функцию.
function arrayToString($arr) {
$count = count($arr);
if ($count <= 2) {
return implode(' and ', $arr);
}
$result = '';
$i = 0;
foreach ($arr as $item) {
if ($i) $result .= ($i == $count - 1) ? ' and ' : ', ';
$result .= $item;
$i++;
}
return $result;
}
Уплотненная версия с уродливым форматированием и игнорированием хороших практик, таких как инициализация переменных:
function arrayToString($arr) {
if (count($arr) <= 2) return implode(' and ', $arr);
foreach ($arr as $item) {
if ($i) $result .= ($i == count($arr) - 1) ? ' and ' : ', ';
$result .= $item; $i++;
}
return $result;
}
Preg_replace может искать последнюю команду, просто поменяв ее на and
$yourString = preg_replace( "/, ([\w#]*)$/", "and \1", $yourString );
Это пример с функциями, названными в моем комментарии выше:
strrpos()
- Найти позицию последнего вхождения подстроки в строкеsubstr()
- вернуть часть строки
и код:
$text = implode(', ', array_values($car_names));
$last = strrpos($text, ',');
if ($last) $text = substr($text, 0, $last-1) . ' AND ' . substr($text, $last+1);
echo $text;
Есть несколько способов сделать это. Вот еще один
<?php
$cars = array('Car #1', 'Car #2', 'Car #3', 'Car #4');
$car = array('Car #1');
$twocars = array('Car #1', 'Car #2');
function arrayToText($arr) {
switch (count($arr)) {
case 1:
return $arr[0];
break;
case 2:
return implode($arr, ' and ');
break;
default:
$last = array_pop($arr);
return implode($arr, ', ') . ' and ' . $last;
break;
}
}
echo '<p>' . arrayToText($cars) . "</p>\n";
echo '<p>' . arrayToText($twocars) . "</p>\n";
echo '<p>' . arrayToText($car) . "</p>\n";
Выход
<p>Car #1, Car #2, Car #3 and Array</p>
<p>Car #1 and Car #2</p>
<p>Car #1</p>
Я не уверен, что есть встроенная функция для этого, но что-то вроде этого должно работать.
$last = $car_names[count($car_names)-1];
$implodedString = implode(', ', array_values($car_names))
$implodedString = str_replace(", $last", "and $last", $implodedString);