我正在尝试使用以下语法“漂亮地打印”数组:
$outString = "[";
foreach($arr as $key=>$value) {
// Do stuff with the key + value, putting the result in $outString.
$outString .= ", ";
}
$outString .= "]";
然而,这种方法的明显缺点是它会在数组打印结束时,在结束“]之前显示”,“。有没有一种方法可以使用$ key => $ value语法来检测您是否在数组中的最后一对,或者我应该使用each()
切换到循环?
答案 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: ["php", "&<>]
// 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]