这可能是一个简单的问题,但你如何遍历一个数组,对每一个做一些事情,直到最后一个并做一些不同的事情?
我有一系列名字。我想输出用逗号分隔的名字列表。
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);
答案 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;
}
}