如何使用foreach循环,但在最后一次迭代中做了不同的事情?

时间:2009-12-03 01:28:05

标签: php

这可能是一个简单的问题,但你如何遍历一个数组,对每一个做一些事情,直到最后一个并做一些不同的事情?

我有一系列名字。我想输出用逗号分隔的名字列表。

  

Joe,Bob,Foobar

我不希望数组中姓氏末尾有逗号,也不希望数组中只有一个值(或者没有!)。

更新:我无法使用implode(),因为我有一个User模型对象数组,我从每个对象中获取名称。

$users = array();
$users[] = new User();

foreach ($users as $user) {
    echo $user->name;
    echo ', ';
}

我如何实现这一目标并仍然使用这些对象?

更新:我过多地担心我在视图脚本中添加了多少行代码,因此我决定创建一个视图助手。这就是我最终的结果:

$array = array();
foreach($users as $user) {
    $array[] = $user->name;
}
$names = implode(', ', $array);

8 个答案:

答案 0 :(得分:15)

使用implode

$names = array('Joe', 'Bob', 'Foobar');
echo implode(', ', $names); # prints: Joe, Bob, Foobar

为了澄清,如果数组中只有一个对象,则根本不会使用', '分隔符,并且将返回包含单个项目的字符串。

编辑:如果你有一个对象数组,并且你希望以不同于带有测试的for循环的方式进行,你可以这样做:

function get_name($u){ return $u->name; };
echo implode(', ', array_map('get_name', $users) ); # prints: Joe, Bob, Foobar

答案 1 :(得分:6)

$array = array('joe', 'bob', 'Foobar');
$comma_separated = join(",", $array);

输出:

joe,bob,Foobar

答案 2 :(得分:3)

有时您可能不想使用内爆。 诀窍是使用辅助变量来监视不是最后一个,但第一次通过循环。 可见:

$names = array('Joe', 'Bob', 'Foobar');
$first = true;
$result = '';
foreach ($names as $name)
{
   if (!$first)
      $result .= ', ';
   else
      $first = false;

   $result .= $name;
}

答案 3 :(得分:1)

implode(', ', $array_of_names)

答案 4 :(得分:1)

...伪码

integer sigh=container.getsize();
sigh--;
integer gosh=0;
foreach element in container
{
  if(gosh!=sigh)
    dosomething();
  else 
    doLastElementStuff();
  gosh++;
}

看着所有其他答案,似乎PHP自从我上次写了一些东西后得到了更多的语法S:D

答案 5 :(得分:1)

我很多时候都在构建SQL语句等。

$joiner = " ";
foreach ($things as $thing) {
    echo "  $joiner $thing \n";
    $joiner = ',';
}

由于某种原因,如果您将“,”,“AND”或“OR”视为项目之前的选项/属性,则更容易计算出逻辑。那么问题就变成了如何抑制第一行的“,”。

答案 6 :(得分:0)

我个人发现最快的方式(如果你进入微优化)是:

  if(isset($names[1])) {
     foreach ($names as $name) {
       $result .= $name . ', ';
    }
    $result = substr($result, 0, -2);
  } else {
    $result = $names[0];
  }

isset($names[1])是检查数组(或字符串)长度的最快(尽管不是很清楚)方法。在这种情况下,执行检查至少两个元素。

答案 7 :(得分:0)

我实际上发现创建逗号分隔文本更容易一些。它有点冗长,但功能调用较少。

<?php

$nameText = '';
for ($i = 0; $i < count($nameArray); $i++) {
    if ($i === 0) {
        $nameText = $nameArray[$i];
    } else {
        $nameText .= ',' . $nameArray[$i];
    }
}

它将逗号添加为每个名称的前缀,除非它是数组的第一个元素。我喜欢使用 for 而不是 foreach ,因为我可以轻松访问当前索引,因此可以轻松访问数组的相邻元素。您可以像这样使用 foreach

<?php

$nameText = '';
$nameCounter = 0;
foreach ($nameArray as $thisName) {
    if ($nameCounter === 0) {
        $nameText = $thisName;
        $nameCounter++;
    } else {
        $nameText .= ',' . $thisName;
    }
}