从foreach循环中删除最后一个字符

3
我该如何从生成的数字列表中删除最后一个管道符号?
$days = new DatePeriod(new DateTime, new DateInterval('P1D'), 6); 
foreach ($days as $day) { 
    echo strtoupper($day->format('d')+543); 
    echo "|";
}

为什么在数字上使用 strtoupper - Glavić
6个回答

5

1. 将字符串连接起来,但在前面添加|

$s = '';
foreach ($days as $day) { 
    if ($s) $s .= '|';
    $s .= strtoupper($day->format('d')+543); 
}
echo $s;

2. 如果不是最后一个项目,则仅输出Echo |

$n = iterator_count($days);
foreach ($days as $i => $day) { 
    echo strtoupper($day->format('d')+543);
    if (($i+1) != $n) echo '|';
}

3. Load to array and then implode

$s = array();
foreach ($days as $day) { 
    $s[] = strtoupper($day->format('d')+543); 
}
echo implode('|', $s);

4. 将字符串连接后再截取最后一个 |(或使用rtrim函数)

$s = '';
foreach ($days as $day) { 
    $s .= strtoupper($day->format('d')+543) . '|';
}
echo substr($s, 0, -1);
# echo rtrim($s, '|');

嘭。你做得太棒了。谢谢。 - portnoy-the-elder
@portnoy-the-elder:我编辑了答案,现在更好的解决方案在#1下面。 - Glavić

3
由于代码的编写方式,您无法做到这一点,因为:
  1. 您不知道将有多少次迭代
  2. 您直接回显字符串(因此无法对输出进行后处理)
实现您想要的结果的一个非常简单的方法是:
echo implode('|', array_map(function($d) { return $d->format('d')+543; },
                            iterator_to_array($days)));

这个操作通过将 $days 的迭代转换为一个数组,使用 array_map 格式化结果,并用标准的 implode 连接它们来实现。

3

在循环中收集输出,并在之前添加|而不是之后。

$days = new DatePeriod(new DateTime, new DateInterval('P1D'), 6); 
$echo = '';
foreach ($days as $day) { 
    if ($echo!='') $echo.='|';
    $echo.=strtoupper($day->format('d')+543); 
}
echo $echo;

570|571|572|573|544|545|546

0

去掉最后一个字符:

echo substr($str,0,-1);

例子

$days = new DatePeriod(new DateTime, new DateInterval('P1D'), 6); 
foreach ($days as $day) { 
    $str .= strtoupper($day->format('d')+543); 
    $str .= "|";
}
echo substr($str,0,-1);

0

试试这样

$cnt = count($days);
$i = 0;
foreach ($days as $day) { 
    echo strtoupper($day->format('d')+543); 
        if($i++ < $cnt)
            echo "|";
 }

countDatePeriod 对象上不起作用。 - Glavić

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接