PHP - 当使用foreach循环遍历数组时,我怎么能判断我是否在最后一对?

时间:2010-08-18 12:31:06

标签: php loops foreach

我正在尝试使用以下语法“漂亮地打印”数组:

$outString = "[";
foreach($arr as $key=>$value) {
    // Do stuff with the key + value, putting the result in $outString.
    $outString .= ", ";
}
$outString .= "]";

然而,这种方法的明显缺点是它会在数组打印结束时,在结束“]之前显示”,“。有没有一种方法可以使用$ key => $ value语法来检测您是否在数组中的最后一对,或者我应该使用each()切换到循环?

8 个答案:

答案 0 :(得分:12)

构建一个数组,然后使用implode

$parts = array();
foreach($arr as $key=>$value) {
    $parts[] = process($key, $value);
}

$outString = "[". implode(", ", $parts) . "]";

答案 1 :(得分:4)

当使用子字符串终止时,你可以剪掉最后一个“,”。

$outString = "[";
foreach($arr as $key=>$value) {
  // Do stuff with the key + value, putting the result in $outString.
  $outString .= ", ";
 }

 $outString = substr($outString,-2)."]";  //trim off last ", "

答案 2 :(得分:4)

单独进行处理,然后使用implode()加入:

$outArr = array();
foreach($arr as $key => $value) {
    $outArr[] = process($key, $value);
}
$outString = '[' . implode(', ', $outArr) . ']';

答案 3 :(得分:3)

尽管你的例子的情况(用逗号连接字符串,implode是正确的方法),回答你的具体问题,迭代数组的规范方法,检查你是否'最后一个元素是使用CachingIterator

<?php
$array = array('k'=>'v', 'k1'=>'v1');

$iter = new CachingIterator(new ArrayIterator($array));
$out = '';
foreach ($iter as $key=>$value) {
    $out .= $value;

    // CachingIterator->hasNext() tells you if there is another
    // value after the current one.
    if ($iter->hasNext()) {
        $out .= ', ';
    }
}
echo $out;

答案 4 :(得分:2)

这样做可能更容易,如果它不是第一项,则在项目前面添加一个逗号。

$first= true;
foreach ($arr as $key => $value) {
    if (! $first) {
        $outString .=', ';
    } else {
      $first = false;
    }

    //add stuff to $outString
}

输出格式是JSON吗?如果是这样,您可以考虑使用json_encode()代替。

答案 5 :(得分:1)

您可以将其作为正常的循环:

$outString = "[";
for ($i = 0; $i < count($arr); $i++) {
   // Do stuff
   if ($i != count($arr) - 1) {
      $outString += ", ";
   }
 }

然而,最好的方法,恕我直言,将所有组件存储在一个数组中,然后进行内爆:

 $outString = '[' . implode(', ', $arr) . ']';

implode()获取数组中的所有元素,并将它们放在一个字符串中,由第一个参数分隔。

答案 6 :(得分:1)

有很多种可能性。我认为这是最简单的解决方案之一:

$arr = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g');

echo '[', current($arr);
while ($n = next($arr)) echo ',', $n;
echo ']';

输出:

[a,b,c,d,e,f,g]

答案 7 :(得分:1)

我倾向于避免在诸如此类的情况下使用循环。您应该使用implode()来连接具有公共分隔符的列表,并使用array_map()在连接之前处理该数组上的任何处理。请注意以下实现应表达这些功能的多功能性。数组映射可以采用表示内置函数或用户定义函数的字符串(函数名称)(前3个示例)。您可以使用create_function()传递一个函数,或者将lambda / anonymous函数作为第一个参数传递。

$a = array(1, 2, 3, 4, 5);

// Using the user defined function
function fn ($n) { return $n * $n; }
printf('[%s]', implode(', ', array_map('fn', $a)));
// Outputs: [1, 4, 9, 16, 25]

// Using built in htmlentities (passing additional parameter
printf('[%s]', implode(', ', array_map( 'intval' , $a)));
// Outputs: [1, 2, 3, 4, 5]

// Using built in htmlentities (passing additional parameter
$b = array('"php"', '"&<>');
printf('[%s]', implode(', ', array_map( 'htmlentities' , $b, array_fill(0 , count($b) , ENT_QUOTES) )));
// Outputs: [&quot;php&quot;, &quot;&amp;&lt;&gt;]

// Using create_function <PHP 5
printf('[%s]', implode(', ', array_map(create_function('$n', 'return $n + $n;'), $a)));
// Outputs: [2, 4, 6, 8, 10]

// Using a lambda function (PHP 5.3.0+)
printf('[%s]', implode(', ', array_map(function($n) { return $n; }, $a)));
// Outputs: [1, 2, 3, 4, 5]