我试图直接只更新数组的一些值。这非常有效。我正在使用以下方法:
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';
}
}