【问题标题】:foreach loop corrupting my array?foreach 循环破坏了我的数组?
【发布时间】:2010-03-23 23:20:02
【问题描述】:

说明

我有一个多维数组,它被迭代以创建具有不同研究兴趣的人的分类视图。主数组看起来像这样:

Array
(
    ...
    ['Cell Biology']      => Array(4 elements)
    ['Molecular']         => Array(6 elements)
    ['Biology Education'] => Array(14 elements)
    ['Plant Biology']     => Array(19 elements)  <--- Last element in array
)

我知道整个数组完好无损且结构正确。这些数组中的唯一信息是用户 ID,如下所示:

Array ('Plant Biology') 19 elements
(
    [0] => 737
    [1] => 742
    [2] => 748
    ...
)

我的问题是,在我通过 foreach 循环运行主数组后,最后一个“子数组”被搞砸了。我所说的搞砸了,我的意思是你看到的东西看起来像:

String (13 characters) 'Plant Biology'

这对损坏的数组在循环内根本没有做任何事情。

有什么提示吗?

PHP 代码

  // ---> Array is OK here
  echo "<h2>Research divided</h2>";
  // Loop areas and list them in 2 columns
  foreach($research['areas'] as $area => $areaArray) {
      // ---> Here it is already corrupted
      $count = count($areaArray);
      if($count > 0) {
          echo "<h3>$area</h3><hr/>";
          echo "<ul>";
          // Loop users within areas, divided up in 2 columns
          for($i=0 ; $i<$count ; $i++) {
              $uid = $areaArray[$i];
              echo "<li>$uid</li>";
          }
          echo "</ul>";
      }
  }

【问题讨论】:

  • 似乎数组中的某些东西在弄乱之前。打算试试for-loop 而不是foreach-loop
  • $area 或 $areaArray 是否在脚本中其他地方的不同函数中使用?如果将它们重命名为 $loop_area 和 $loop_areaArray 会发生什么?
  • 您能否提供可以实际重现您的问题的代码?就像创建$research['areas'] 数组所必需的一样。
  • 旁注:您想在tr 标签内使用td 元素而不是li 元素。 :)
  • 我认为它可能在 $research['area'];,您可能是指 $research。除非 $research 有一个带有 area 名称的 array() ,那么你没有一个要循环的数组...为什么不尝试 is_array() 来检查数组是否是一个数组,然后循环显示错误代码。

标签: php arrays multidimensional-array


【解决方案1】:

$area 或 $areaArray 是否在脚本中其他地方的不同函数中使用?如果将它们重命名为 $loop_area 和 $loop_areaArray 以防止意外覆盖变量会发生什么?

【讨论】:

  • 解决了,谢谢。这与我之前在 foreach 循环中实际使用 $area 变量有关。在该循环中,它通过引用传递:&amp;$area。当再次循环而不将其作为引用传递时,它会弄乱最后一个数组元素。这是非常危险的行为,因为有时像$_SESSION 这样的变量会被foreach 循环,谁知道某个扩展库或其他作者的代码是否有一个带有&amp;$_SESSION 的foreach 循环。 Jai 提供的以下链接是对其进行解释的地方。
  • 多次被这个咬后,我发誓永远不要使用foreach循环。但是,解决方案是确保始终取消设置循环后创建的变量。这不是很方便,所以我只是不使用foreach。
【解决方案2】:

如果您之前使用相同的变量名称作为值的引用通过引用循环遍历数组,这看起来可能会发生错误。

因此,如果您的代码中较早的 $areaArray 通过引用在 foreach 中使用,它可能会损坏您的数据。

确保你的 foreach 中的两个变量之前都没有使用过,或者在循环之前取消设置它们。

退房:

http://bugs.php.net/29992

有关此类问题的更多信息。

【讨论】:

  • 这就是确切的错误!感谢您提供有用的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多