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


Illegal offset type error when => value is omitted

如果我省略=> $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;
}