Php 忽略=>值时出现非法偏移类型错误

Php 忽略=>值时出现非法偏移类型错误,php,Php,如果省略=>$v部分,下面代码的第3行将失败。我得到以下错误: 警告:第404行的/home/site/page.php中输入的偏移量非法 当第5行中的[$k]更改为['$k']时,我收到以下错误 注意:未定义索引:第404行的/home/site/page.php中的$k 当它像下面这样使用完整的$k=>$v时,一切都可以工作。我甚至不用$v。为什么我需要在foreach循环中使用它才能让它工作呢 <? if ( $arr[ 'status'][ 'chain'] ) { f

如果省略=>$v部分,下面代码的第3行将失败。我得到以下错误:

警告:第404行的/home/site/page.php中输入的偏移量非法

当第5行中的[$k]更改为['$k']时,我收到以下错误

注意:未定义索引:第404行的/home/site/page.php中的$k

当它像下面这样使用完整的$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>
    <? } 
} ?>

我确实看到了,但不知道它是否真的适用。非常感谢

这是因为$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>
    <? } 
} ?>
构造$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'] ?>

在使用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;
}

无论采用哪种方法,都会循环遍历数组中的每一项

如果只执行foreach$k,那么将为数组中的每个值设置$k,忽略键

如果将其保持为$k=>$v,则为每个键设置$k,并为附加到键的每个值设置$v

例如,您有一个如下所示的数组:

$arr=array(
    1=>'a',
    2=>'b',
    3=>'c'
);
并且做:

foreach($arr as $k){
    echo "k is $k <br>";
}
如果你这样做了

foreach($arr as $k=>$v){
    echo "k is $k and v is $v<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