Добавьте запятые к элементам и с «и» в конце в PHP - PullRequest
9 голосов
/ 30 января 2012

Я хочу добавить запятую к каждому элементу, кроме последнего. Последний должен иметь «и».

пункт 1, пункт 2 и пункт 3

Но предметы могут быть от 1 +

Так что если один предмет:

Элемент 1

Если два предмета:

Позиция 1 и Позиция 2

Если три предмета:

пункт 1, пункт 2 и пункт 3

Если четыре элемента:

пункт 1, пункт 2, пункт 3 и пункт 4

и т. Д. И т. П.

Ответы [ 6 ]

10 голосов
/ 30 января 2012

Вот функция для этого; просто передайте массив.

function make_list($items) {
    $count = count($items);

    if ($count === 0) {
        return '';
    }

    if ($count === 1) {
        return $items[0];
    }

    return <a href="https://php.net/implode" rel="nofollow">implode</a>(', ', <a href="https://php.net/array_slice" rel="nofollow">array_slice</a>($items, 0, -1)) . ' and ' . <a href="https://php.net/end" rel="nofollow">end</a>($items);
}

Демо

2 голосов
/ 31 января 2012

Решение Minitech с самого начала является элегантным, за исключением одной небольшой проблемы, его вывод приведет к:

var_dump(makeList(array('a', 'b', 'c'))); //Outputs a, b and c

Но правильное форматирование этого списка (для обсуждения) должно быть; а, б и в. В его реализации к атрибуту, следующему за последним, никогда не будет добавлен ',', потому что срез массива обрабатывает его как последний элемент массива, когда он передается implode().

Вот реализация, которая у меня была, и правильно (опять же, для обсуждения) форматирует список:

class Array_Package
{
    public static function toList(array $array, $conjunction = null)
    {
        if (is_null($conjunction)) {
            return implode(', ', $array);
        }

        $arrayCount = count($array);

        switch ($arrayCount) {

            case 1:
                return $array[0];
                break;

            case 2:
                return $array[0] . ' ' . $conjunction . ' ' . $array[1];
        }

        // 0-index array, so minus one from count to access the
        //  last element of the array directly, and prepend with
        //  conjunction
        $array[($arrayCount - 1)] = $conjunction . ' ' . end($array);

        // Now we can let implode naturally wrap elements with ','
        //  Space is important after the comma, so the list isn't scrunched up
        return implode(', ', $array);
    }
}

// You can make the following calls

// Minitech's function
var_dump(makeList(array('a', 'b', 'c'))); 
// string(10) "a, b and c"

var_dump(Array_Package::toList(array('a', 'b', 'c')));
// string(7) "a, b, c"

var_dump(Array_Package::toList(array('a', 'b', 'c'), 'and'));
string(11) "a, b, and c"

var_dump(Array_Package::toList(array('a', 'b', 'c'), 'or'));
string(10) "a, b, or c"

Ничего против другого решения, просто хотел поднять этот вопрос.

1 голос
/ 30 января 2012

Вы можете сделать это так:

$items = array("Item 1", "Item 2", "Item 3", "Item 4");

$item = glueItems($items);

function glueItems($items) {
    if (count($items) == 1) {
        $item = implode(", ", $items);
    } elseif (count($items) > 1)  {
        $last_item = array_pop($items);
        $item = implode(", ", $items) . ' and ' . $last_item;
    } else {
        $item = '';
    }
    return $item;
}
echo $item;
1 голос
/ 30 января 2012

Вы можете взорвать X - 1 предметов запятой и добавить последний с "и".

0 голосов
/ 04 марта 2019

Вот вариант, который имеет возможность поддерживать спорную Oxford Comma и принимает параметр для связи (и / или). Обратите внимание на дополнительную проверку для двух предметов; даже сторонники Оксфорда в этом случае не используют запятую.

function conjoinList($items, $conjunction='and', $oxford=false) {
    $count = count($items);

    if ($count === 0){
        return '';
    } elseif ($count === 1){
        return $items[0];
    } elseif ($oxford && ($count === 2)){
        $oxford = false;
    }

    return implode(', ', array_slice($items, 0, -1)) . ($oxford? ', ': ' ') . $conjunction . ' ' . end($items);
}
0 голосов
/ 30 января 2012

Ну, если это массив, просто используйте implode(...)

Пример:

$items = array("Item 1", "Item 2", "Item 3", "Item 4");
$items[count($items) - 1] = "and " . $items[count($items) - 1];
$items_string = implode(", ", $items);

echo $items_string;

Демонстрация: http://codepad.viper -7.com / k7xISG

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...