【问题标题】:PHP scope questionPHP范围问题
【发布时间】:2010-05-21 09:05:31
【问题描述】:

我正在尝试查看一组记录(员工),在这个循环中,我调用了一个函数,该函数返回另一个记录数组(每个员工的约会)。

foreach($staffmembers as $staffmember)
{   
        $staffmember['appointments'] = get_staffmember_appointments_for_day($staffmember);
        //  print_r($staffmember['appointments'] works fine 
}

这工作正常,但是,稍后在脚本中,我需要再次遍历记录,这次使用约会数组,但是它们不可用。

foreach ($staffmembers as $staffmember)
{                                                             
        //do some other stuff
        //print_r($staffmember['appointments'] no longer does anything
}

通常,我会在第二个循环中执行第一个循环中的函数,但是这个循环已经嵌套在另外两个循环中,这将导致相同的 sql 查询运行 168 次。

任何人都可以提出解决方法吗?

任何建议将不胜感激。

谢谢

【问题讨论】:

  • 我假设第二个循环出现在与第一个循环相同的函数中?
  • 我不确定我是否理解。循环没有自己的范围。你在什么时候失去了$staffmembers,为什么?

标签: php arrays scope


【解决方案1】:

foreach 迭代数组的副本。如果要更改值,需要reference它:

foreach($staffmembers as &$staffmember) // <-- note the &
{   
    $staffmember['appointments'] = get_staffmember_appointments_for_day($staffmember);
    //  print_r($staffmember['appointments'] works fine 
}

来自文档:

注意:除非数组被引用,否则foreach 对指定数组的副本而不是数组本身进行操作。 foreach 对数组指针有一些副作用。不要在 foreach 期间或之后依赖数组指针而不重置它。

从 PHP 5 开始,您可以通过在 $value 前面加上 &amp; 来轻松修改数组的元素。这将分配 reference 而不是复制值。

【讨论】:

  • 我认为这与他的问题无关。编辑:好的,我认为这就是他的意思,真的不是范围界定问题。
  • @Artefacto:它在某种程度上与范围有关。副本在循环外不可见;)
  • 嗯...$staffmember last 副本将在循环之外可见,所以这不是真正的范围界定问题... =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2011-04-10
  • 2011-08-11
  • 2011-09-26
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
相关资源
最近更新 更多