如何防止连接字符串开头的多余逗号

How to prevent surplus comma at the beginning of a concatenated string

我正在尝试解决 PHP 中的 FizzBuzz 问题(在本例中使用 'ApaBole')。

从1数到100,能被3整除的数输出'Apa',能被5整除的数输出'Bole',能被两者整除的数输出'ApaBole'。所有其他数字应自行输出。

想要的结果

1, 2, Apa, 4, Bole, Apa, 7, 8, Apa, Bole, 11, Apa, 13, 14, ApaBole, 16, 17, Apa, 19, Bole, Apa, 22, 23, Apa, Bole, 26, Apa, 28, 29, ApaBole, 31, 32, Apa, 34, Bole, Apa, 37, 38, Apa, Bole, 41, Apa, 43, 44, ApaBole, 46, 47, Apa, 49, Bole, Apa, 52, 53, Apa, Bole, 56, Apa, 58, 59, ApaBole, 61, 62, Apa, 64, Bole, Apa, 67, 68, Apa, Bole, 71, Apa, 73, 74, ApaBole, 76, 77, Apa, 79, Bole, Apa, 82, 83, Apa, Bole, 86, Apa, 88, 89, ApaBole, 91, 92, Apa, 94, Bole, Apa, 97, 98, Apa, Bole

我的尝试

for ($i= 1; $i <= 100; $i++)
{
    if($i % 15 == 0){
        echo ", ApaBole";
    } elseif($i % 3 == 0){
        echo ", Apa";
    } elseif($i % 5 == 0){
        echo ", Bole";
    } else{
        // rtrim($i, ", ");
        echo ', '.$i;
    }
}

输出

, 1, 2, Apa, 4, Bole, Apa, 7, 8, Apa, Bole, 11, Apa, 13, 14, ApaBole, 16, 17, Apa, 19, Bole, Apa, 22, 23, Apa, Bole, 26, Apa, 28, 29, ApaBole, 31, 32, Apa, 34, Bole, Apa, 37, 38, Apa, Bole, 41, Apa, 43, 44, ApaBole, 46, 47, Apa, 49, Bole, Apa, 52, 53, Apa, Bole, 56, Apa, 58, 59, ApaBole, 61, 62, Apa, 64, Bole, Apa, 67, 68, Apa, Bole, 71, Apa, 73, 74, ApaBole, 76, 77, Apa, 79, Bole, Apa, 82, 83, Apa, Bole, 86, Apa, 88, 89, ApaBole, 91, 92, Apa, 94, Bole, Apa, 97, 98, Apa, Bole%

如何删除第一个 ,

您问题的解答

我看到你实际上是在尝试解决常见的 FizzBu​​zz 面试问题,除了你的问题被称为 'ApaBole' 因为我猜这不是英语。

你可以这样巧妙地解决它:

$output = [];
for ($i = 1; $i <= 100; $i++) {
    $output[] = ($i % 3 ? '' : 'Apa') . ($i % 5 ? '' : 'Bole') ?: $i;
}
echo implode(', ', $output);

通过将所有元素添加到一个数组中,您可以使用 implode() 用逗号将它们连接在一起,而无需在字符串中添加任何杂散的前导或尾随逗号。


关于删除字符的补充说明

为了回答您关于 PHP 中一般字符串操作的问题,这里有一些提示,希望对您的学习有所帮助。

要去除字符串的第一个字符,您只需要从第二个字符开始得到一个 substring

$output = substr($input, 1);

但是,您似乎有一个 comma-separated 列表,您希望在其中确保没有前导逗号或 'empty' 第一项(您也有一个 space )。在这种情况下,您实际上可能想要 trim 关闭字符串开头的所有 commas/spaces,使用 ltrim().

$output = ltrim($input, ' ,');

如果您想确保在字符串的开头 末尾没有逗号或 space,您可以只使用 trim() 代替。

$output = trim($input, ' ,');

无论如何,最好改进您的原始代码,这样一开始就没有额外的 leading/trailing 逗号。这正是面试问题的重点所在 - 看看您是否可以妥善设计一个不会留下那样混乱的解决方案。

我认为最简单的方法是在创建字符串时删除 ,,例如:

<?php
for ($i= 1; $i <= 100; $i++)
{
    if($i % 15 == 0){
        echo ", ApaBole";
    } elseif($i % 3 == 0){
        echo ", Apa";
    } elseif($i % 5 == 0){
        echo ", Bole";
    } else{
        // rtrim($i, ", ");
        if($i == 1){
            echo $i;
        }else{
            echo ', '.$i;
        }
    }
}

演示:http://sandbox.onlinephpfunctions.com/code/de34ba2ec723ac96a08c1a81c1a82d8463cb1e9d

您可以通过几种不同的方式实现这一目标。一个是按照@BadHorsie 的建议删除字符串中的第一个元素,但是您也可以在生成第一个字符串的部分中使用检查,无论您是否在第一次迭代中。

<?php

for ($i= 1; $i <= 100; $i++) {
    if ($i % 15 == 0) {
        echo ", ApaBole";
    } elseif ($i % 3 == 0) {
        echo ", Apa";
    } elseif ($i % 5 == 0) {
        echo ", Bole";
    } else {
        echo ($i == 1 ? '' : ', ').$i;
    }
}

另一种方法是将所有值存储在一个数组中,一旦您拥有了所有值,implode() 它就会带有您想要的分隔符。

$values = [];
for ($i= 1; $i <= 100; $i++) {
    if ($i % 15 == 0) {
        $values[] = "ApaBole";
    } elseif ($i % 3 == 0) {
        $values[] = "Apa";
    } elseif ($i % 5 == 0) {
        $values[] = "Bole";
    } else {
        $values[] = $i;
    }
}
echo implode(", ", $values);

另一种可能是将所有值存储在 string-variable 中,然后 trim 第一个逗号,然后再输出所有值。

$output = '';
for ($i= 1; $i <= 100; $i++) {
    if ($i % 15 == 0) {
        $output .= ", ApaBole";
    } elseif ($i % 3 == 0) {
        $output .= ", Apa";
    } elseif ($i % 5 == 0) {
        $output .= ", Bole";
    } else {
        $output .= ', '.$i;
    }
}
echo ltrim($output, ', ');

另一种实现结果的方法是将内容存储在数组中,然后 implode() :

$result = [];
for ($i= 1; $i <= 100; $i++)
{
    $temp = "";
    
    if($i % 3 == 0){
        $temp = "Apa";
    }
    
    if($i % 5 == 0){
        $temp .= "Bole"; // concate with previous value,
    }                    // if $i % 3 == 0 && $i % 5 == 0 then $i % 15 == 0
    
    if ($temp == "")
    {
        $temp = $i;
    }
    
    $result[] = $temp;
}

echo implode(", ", $result);

Try it yourself

另一种使用数组的方法:

<?php
$res = []; // create empty array
for ($i= 1; $i <= 100; $i++)
{
    if($i % 15 == 0){
        array_push($res, "ApaBole"); // push value into array
    } elseif($i % 3 == 0){
        array_push($res, "Apa"); // push value into array
    } elseif($i % 5 == 0){
        array_push($res, "Bole"); // push value into array
    } else {
        array_push($res, $i); // push value into array
    }
}

echo implode(',', $res); // implode array with commas
?>

https://phpize.online/

另一个没有if的压缩代码:

<?php
$res = [];
for ($i= 1; $i <= 100; $i++)
{
    array_push($res, (
        $i % 15 == 0 ? "ApaBole" : (
            $i % 3 == 0 ? "Apa" : (
                $i % 5 == 0 ? "Bole" : $i
            )
        )
    ));
}

echo implode(',', $res);
?>