如果我省略=> $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>
<? }
} ?>
我确实看到了这个答案,但不知道它是否真的适用。非常感谢!
无论哪种方式,您都在循环访问数组中的每个项目。
如果你只是 foreach $k,你正在为数组中的每个 VALUE 设置$k,忽略键
如果将其保留为 $k => $v,则将$k设置为每个键,$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
>构造$k => $v
用于在foreach
构造中迭代数组的键和值。 您可以单独使用值$v
进行迭代,但不能单独循环访问键$k
。 如果您使用了以下内容:
foreach ($arr['status']['chain'] as $k)
。foreach 循环在语法上是有效的,但$k
将使用数组值而不是键填充。 在这种情况下,数组元素$ 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'] ?>
}
这是因为$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>
<? }
} ?>
使用 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;
}