&;Array()-更新数组后,最后一行前缀为“与”


&Array() - Final Row prefixed with ampersand after Updating Array

我试图直接只更新数组的一些值。这非常有效。我正在使用以下方法:

foreach( $items as &$item ) {
    if( $criteria == 'correct' ) {
      // update array
      $item['update_me'] = 'updated';
    }
}

所以我现在有了一个更新的数组$items。

然而,我遇到的问题是,当这个数组输出到屏幕时(通过另一个foreach循环),数组的最后一行丢失了。

如果我通过var_dump打印整个数组($items);方法,我注意到每一行都以Array(9)为前缀。然而最后一行的前缀是&数组(9)-注意前面的"与"符号。我相信这意义重大!但我不确定这意味着什么。为什么它只应用于数组中的最后一行?我该如何摆脱它?

来自评论:

array(6) { 
    [0]=> array(9) { 
        ["item_id"]=> string(4) "1" 
        ["item_description"]=> string(9) "blah blah" 
        ["quantity"]=> string(1) "4" 
        ["unit_cost"]=> string(4) "5.00" 
        ["subtotal"]=> string(4) "20.00" 
    } 
    [1]=> &array(9) { 
        ["item_id"]=> string(4) "2" 
        ["item_description"]=> string(9) "blah blah" 
        ["quantity"]=> string(1) "1" 
        ["unit_cost"]=> string(4) "5.99" 
        ["subtotal"]=> string(4) "5.99" 
    } 
}

循环后必须取消设置$item。正确代码:

foreach( $items as &$item ) {
    if( $criteria == 'correct' ) {
      // update array
      $item['update_me'] = 'updated';
    }
}
unset($item);

&在vardump结果中签名,指定这是引用。您可以使用xdebug_zval_dump()函数进行检查:

xdebug_zval_dump($item)

您将看到is_ref=true。在PHP中,这意味着有另一个变量指向同一个zval容器(什么是zval?请参阅此处http://php.net/manual/en/internals2.variables.intro.php)。如果您使用&在循环中,必须始终在循环后取消设置引用,以避免难以检测的错误。

我不确定这里是否是这种情况,但根据参考,如果循环后没有取消引用,foreach循环会导致此类问题(手册中对此有警告)。尝试在foreach更新完成后立即添加unset($item);,看看它是否解决了问题。

我认为这不是最好的方法。我建议这样做:

foreach( array_keys($items) as $itemkey ) {
    if( $criteria == 'correct' ) {
        // update array
        $items[$itemkey]['update_me'] = 'updated';
    }
}