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

问题描述

我正在尝试解决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 ,伯乐

我的尝试

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,阿帕,伯乐%

如何删除一个,

解决方法

有几种不同的方法可以实现这一目标。正如@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);

另一种可能是将所有值存储在字符串变量中,然后在输出所有值之前先修剪第一个逗号。

$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

,

问题的解决方案

我看到您实际上正在尝试解决常见的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);

但是,看起来您有一个逗号分隔的列表,您想在其中确保没有前导逗号或“空”的第一项(那里也有空格)。在这种情况下,您实际上可能想使用ltrim()来修剪字符串开头的所有逗号/空格。

$output = ltrim($input,');

如果要确保在字符串的开始末尾没有逗号或空格,则可以改用trim()

$output = trim($input,');

无论如何,最好改进原始代码,这样一来您就不必再有其他逗号引起了。这正是面试问题的重点-看看您是否可以适当地设计出不会留下那样混乱的解决方案。

,

我认为最简单的方法是在创建像这样的字符串时删除,

<?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

,

使用数组的另一种方法:

<?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);
?>