PHP для формирования строки типа «A, B, C и D» из значений массива - PullRequest
4 голосов
/ 15 июня 2011

Учитывая следующий массив:

Array
(
    [143] => Car #1
    [144] => Car #2
    [145] => Car #3
)

В настоящее время я использую это

implode(', ', array_values($car_names))

для генерации строки типа

Car # 1, Car# 2, Автомобиль № 3

Я бы хотел получить что-то вроде

Автомобиль № 1, Автомобиль № 2 и Автомобиль № 3

Идея заключалась бы в вставке "и" между двумя последними элементами массива.

Если массив содержит две пары ключ / значение (например, у пользователя 2 машины), запятых не будет.

Car # 1 и Car # 2

И если массив содержит один ключ / значение (например, у пользователя 1 car)

Автомобиль № 1

Есть предложения, как это сделать?Я пытался использовать array_splice, но я не уверен, что это правильный путь (т.е. вставка нового элемента в массив).

Спасибо за помощь!

Ответы [ 7 ]

6 голосов
/ 15 июня 2011
$last = array_pop($car_names);
echo implode(', ', $car_names) . ' AND ' . $last;
3 голосов
/ 15 июня 2011

Я думаю, что вы, вероятно, хотите что-то подобное, используя array_pop, чтобы получить последний элемент от конца массива. Затем вы можете взорвать оставшуюся часть массива и добавить последний элемент произвольным образом:

$last_value = array_pop($car_names);
$output = implode(', ', array_values($car_names));
$output .= ($output ? ' and ' : '') . $last_value;

Редактировать: добавлено условие для проверки наличия в массиве только одного элемента.

2 голосов
/ 15 июня 2011

Это решение немного длиннее, но протестировано для всех размеров массивов и является комплексным решением. Кроме того, он не изменяет массив, как указано выше, и разделяется на функцию.

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;
}
2 голосов
/ 15 июня 2011

preg_replace может искать последнюю команду, просто поменяв ее на and

$yourString = preg_replace( "/, ([\w#]*)$/", "and \1", $yourString );
0 голосов
/ 15 июня 2011

Есть несколько способов сделать это.Вот еще один.

<?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>
0 голосов
/ 15 июня 2011

Это пример с функциями, названными в моем комментарии выше:

  1. strrpos() - Найти позицию последнего вхождения подстроки в строке
  2. 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;
0 голосов
/ 15 июня 2011

Я не уверен, что для этого есть встроенная функция, но что-то вроде этого должно работать.

$last = $car_names[count($car_names)-1];
$implodedString = implode(', ', array_values($car_names))
$implodedString = str_replace(", $last", "and $last", $implodedString);
...