我试图直接更新数组的某些值。这是完美的。我使用以下方法:
foreach( $items as &$item ) {
if( $criteria == 'correct' ) {
// update array
$item['update_me'] = 'updated';
}
}
所以我现在有一个名为$ items的更新数组。
但是,我遇到的问题是,当此数组输出到屏幕(通过另一个foreach循环)时,数组的最后一行丢失了。
如果我通过var_dump($ items)打印整个数组;方法,我注意到每行都以Array(9)为前缀。然而最后一行以& Array(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"
}
}
答案 0 :(得分:11)
你必须在循环后取消设置$ item。正确的代码:
foreach( $items as &$item ) {
if( $criteria == 'correct' ) {
// update array
$item['update_me'] = 'updated';
}
}
unset($item);
&安培;在var_dump结果中签名指定这是引用。您可以使用xdebug_zval_dump()函数检查它:
xdebug_zval_dump($item)
你会看到is_ref = true。在PHP中,这意味着有另一个变量指向同一个zval容器(什么是zval?请参见此处http://php.net/manual/en/internals2.variables.intro.php)。 如果你正在使用&在循环中,您必须始终在循环后取消设置引用,以避免难以检测的错误。
答案 1 :(得分:5)
我不确定这里是否是这种情况,但是如果在循环之后没有设置引用(已经有关于它的警告in the manual),则已知引用的foreach循环会导致这类问题。 。尝试在更新foreach完成后立即添加unset($item);
,看看它是否解决了问题。
答案 2 :(得分:1)
我认为这不是最好的方法。我建议这样做:
foreach( array_keys($items) as $itemkey ) {
if( $criteria == 'correct' ) {
// update array
$items[$itemkey]['update_me'] = 'updated';
}
}