【问题标题】:Has anyone ever seen this happen in a php freach loop? [closed]有没有人在 php foreach 循环中看到过这种情况? [关闭]
【发布时间】:2013-07-17 21:59:52
【问题描述】:

我从一个有 101 个键的查询构建了一个多维数组

当我在某个 foreach 循环之前回显 $result['q101'] 时,它会显示正确的数据..

在此循环之后,数组以某种方式修改为 $result['q101'] => 8...???

注意:无论数字如何,这都会发生在最后一个键上。

> [q99] => Array
>     (
>         [name] => Disentanglement from Love Relationship
>         [abbr] => DfLR
>         [type] => Ascending
>         [response] => Sometimes
>         [score] => 3
>     )
> 
> [q100] => Array
>     (
>         [name] => Feelings of Self Worth
>         [abbr] => FoSW
>         [type] => Ascending
>         [response] => Almost Always
>         [score] => 1
>     )
> 
> [q101] => 8 /// WTF is this..??

下面是罪魁祸首..如果我删除这个一切都是笨拙的多莉。

foreach ($result as $key => $val){
    $response_table .= '<tr><td>'.str_replace('q', '', $key).'</td><td>'.$val['response'].'</td><td>'.$val['abbr'].'</td><td>'.$val['type'].'</td><td>'.$val['score'].'</td></tr>';
    $min[$val['abbr']] += 1;
    $max[$val['abbr']] += 1;    
}

【问题讨论】:

  • 你能告诉我们完整的代码吗?是否有任何通过引用使用$val 的foreach 循环?像这样:$key =&gt; &amp;$val.
  • 有...我不知道这会将活动扳手扔进系统的其余部分。现在我回到手册并看到红色的大警告,我在打自己的耳光......
  • 我通常在任何foreach 循环上方添加注释,使用引用语法“警告:foreach by reference!”并在关闭} 后立即添加一个unset(),并附上适当的评论,说明它正在破坏参考。引用应该谨慎使用 - 它们有各种尴尬的含义,包括对性能的负面影响(内部使用称为“写入时复制”的技巧针对按值分配进行了优化)。
  • @IMSoP - 所以,如果循环是标准的 $key => $val 那么未设置就不需要正确?
  • @SmithSmithy 正确。 &amp; 是需要注意的标志。

标签: php multidimensional-array foreach


【解决方案1】:

确保在 foreach 之后取消设置 $key, $val。 来自http://php.net/manual/en/control-structures.foreach.php 即使在 foreach 循环之后,对 $value 和最后一个数组元素的引用仍然存在。建议通过 unset() 销毁。

【讨论】:

  • 如何通过引用分配?只有对象是通过引用分配的
  • 请注意,这仅在您使用按引用语法时才相关(foreach($result as $key =&gt; &amp;$val) - 请注意&amp;)。问题中显示的代码没有使用这个,但是之前的循环可能已经完成了。
  • 你搞定了......之前的循环使用了 &$val,我不知道它仍然保持原样......谢谢......这是小事......
  • @Barbara 很好的答案,继续这样,你很快就会得到很多代表:)
  • @DevZer0 这在两个方面是不正确的陈述:首先,PHP 中的 variables 是通过引用显式使用 =&amp; 分配的,但在其他情况下,例如提到的那个.其次,这会导致为任一变量赋值以影响两个变量——它实际上是一个具有多个名称的变量;这 not 与两个都指向同一个对象的变量相同 - 操作对象似乎会影响两个变量,但如果您为其中一个变量分配一个新值,另一个是 受影响。 (当然,除非它是通过引用分配的。)
猜你喜欢
  • 2012-01-31
  • 2017-04-04
  • 2011-01-15
  • 1970-01-01
  • 2015-05-06
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
相关资源
最近更新 更多