从 foreach 循环中剥离最后一个字符


Stripping last character from a foreach loop

如何从生成的数字列表中去除最后一个管道?

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

1.连接到字符串,但在之前添加|

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

2.仅在不是最后一项时才回显|

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

3. 加载到阵列,然后内爆

$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, '|');

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

$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

由于编写代码,因此无法执行此操作,因为:

  1. 你不知道会有多少次迭代和
  2. 您直接回显字符串(因此无法对输出进行后处理)

实现所需结果的一个非常简单的方法是

echo implode('|', array_map(function($d) { return $d->format('d')+543; },
                            iterator_to_array($days)));

这是通过将$days的迭代转换为数组,用array_map格式化结果并用标准implode将它们粘合在一起来工作的。

剪切最后一个字符:

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

尝试喜欢

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

可以使用输出缓冲来控制回显的内容。

http://md1.php.net/manual/en/function.ob-start.php

或者内爆解决方案。