=>>时非法偏移类型错误值被省略

时间:2012-06-27 21:05:53

标签: php

如果省略=> $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,但不知道它确实适用。非常感谢!

4 个答案:

答案 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;
}