PHP使用AND添加逗号到项目

时间:2012-01-30 15:03:58

标签: php loops csv

我想为除最后一项之外的所有项目添加逗号。最后一个必须有“和”。

第1项,第2项和第3项

但是项目可以是1 +

所以,如果1项:

  

第1项

如果有2个项目:

  

第1项和第2项

如果有3个项目:

  

第1项,第2项和第3项

如果有4个项目:

  

第1项,第2项,第3项和第4项

等等。

6 个答案:

答案 0 :(得分:10)

这是一个功能;只是传递数组。

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

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

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

    return implode(', ', array_slice($items, 0, -1)) . ' and ' . end($items);
}

Demo

答案 1 :(得分:2)

minitech的解决方案一开始就很优雅,除了一个小问题,他的输出将导致:

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

但是这个清单的适当格式(争论不休)应该是; a,b和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"

没有什么可以反对其他解决方案,只是想提出这一点。

答案 2 :(得分:1)

你可以用逗号破坏X - 1项目,并用“和”添加最后一项。

答案 3 :(得分:1)

你可以这样做:

$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;

答案 4 :(得分:0)

如果它是一个数组,只需使用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

答案 5 :(得分:0)

这是一个变体,可以选择支持有争议的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);
}