如果省略=> $v
部分,则下面代码的第3行将失败。我收到以下错误:
Warning: Illegal offset type in /home/site/page.php on line 404
当第5行中的[$k]
更改为['$k']
时,我收到以下错误。
Notice: Undefined index: $k in /home/site/page.php on line 404
当它如下所示时,完整的$k => $v
一切正常。我甚至不使用$v
。为什么我需要在foreach
循环中使其工作呢?
<? if ( $arr[ 'status'][ 'chain'] ) {
foreach ( $arr[ 'status'][ 'chain'] as $k => $v) { ?>
<tr>
<td class="line_item_data status_td">
<?= $ arr[ 'status'][ 'chain'][$k][ 'message'] ?>
</td>
<td align="center">
<img src="images/green_check.gif" width="20" />
</td>
</tr>
<? }
} ?>
我确实看到this answer,但不知道它确实适用。非常感谢!
答案 0 :(得分:2)
无论你采用哪种方式,你都要循环遍历数组中的每一项。
如果你只做foreach $ k,你就要为数组中的每个VALUE设置$ k,忽略键
如果保留为$ k =&gt; $ v,你为每个KEY设置$ k,为每个KEY设置$ v。
例如,您有一个如下所示的数组:
$arr=array(
1=>'a',
2=>'b',
3=>'c'
);
并做:
foreach($arr as $k){
echo "k is $k <br>";
}
输出将是:
k is a
k is b
k is c
然而,如果你这样做
foreach($arr as $k=>$v){
echo "k is $k and v is $v<br>";
}
输出将是:
k is 1 and v is a
k is 2 and v is b
k is 3 and v is c
答案 1 :(得分:1)
那是因为$ k是一个值,但你将它用作键。相反,写一下:
<? if ( $arr[ 'status'][ 'chain'] ) {
foreach ( $arr[ 'status'][ 'chain'] as $k) { ?>
<tr>
<td class="line_item_data status_td">
<?= $k[ 'message'] ?>
</td>
<td align="center">
<img src="images/green_check.gif" width="20" />
</td>
</tr>
<? }
} ?>
答案 2 :(得分:1)
构造$k => $v
用于在foreach
构造中迭代数组的键和值。您可以单独使用值$v
进行迭代,但不能单独迭代密钥$k
。如果您使用以下内容:
foreach ($arr['status']['chain'] as $k)
... foreach循环在语法上是有效的,但$k
将填充数组 value 而不是密钥。在这种情况下,数组元素$ arr[ 'status'][ 'chain'][$k][ 'message']
不存在,因为$k
没有在数组$arr['status']['chain']
中保存有效的键。
在循环内部,$v
包含您尝试索引的数组元素,因此您只需要访问它:
<?= $v['message'] ?>
这相当于$arr['status']['chain'][$k]['message']
。所以最终你的循环中不需要$v
,而是你不需要$k
。
// Iterate the values only. Keys aren't actually needed.
foreach ( $arr[ 'status'][ 'chain'] as $v) {
// snip html markup..
<?= $v[ 'message'] ?>
}
答案 3 :(得分:1)
使用foreach
时,总是要指定值,它是可选的键。
因此,
foreach ($array as $k => $v)
...然后$k
是关键,$v
是值。如果你这样做:
foreach ($array as $k)
...然后$k
成为值,而不是密钥。如果你只想要密钥,你可以这样做:
while (list($key) = each($array)) {
echo $key;
}
...或:
while (key($array) && next($array)) {
echo $key;
}