【问题标题】:PHP - array unset not working in foreach loopPHP - 数组未设置在 foreach 循环中不起作用
【发布时间】:2023-03-06 13:39:01
【问题描述】:

我的 $positions 数组中有各种项目并执行以下操作:

foreach ($positions as &$position) {

    if ($position['date'] == $order['date']) {
        unset($position);
    }
}
var_dump($positions);

var_dump 仍然显示应该排除的 $position。

当我这样做时

foreach ($positions as $key => &$position) {
    if ($position['date'] == $order['date']) {
        unset($positions[$key]);
    }    
}

它确实删除了比预期更多的项目。

任何人都知道在这两种情况下会发生什么以及为什么 unset($position) 不起作用?我在 foreach 循环中使用 '&' 引用该项目。

谢谢!

【问题讨论】:

  • 尝试从第二次尝试中删除 &。
  • 你可以试试array_diff。
  • 我想我明白了。在第二种情况下,它确实删除了比预期更多的项目,因为某些值在数据库中存储为这样的“-0001-11-30 00:00:00.000000”作为日期时间,但我希望所有内容都有一个有效的日期或 NULL。
  • $positions = array_filter($positions, function($x) { return $x['date'] != '1'; });

标签: php arrays foreach


【解决方案1】:

不要使用&$variableName,而是使用$varibaleName,因为php中没有指针的概念,并且引用运算符的使用不当有时会导致意想不到的结果。

foreach ($positions as $key => $eachPosition)
{
    if ($eachPosition['date'] == $order['date']) 
    {
        unset(positions[$key]);
    }    
}

【讨论】:

    【解决方案2】:
    foreach ($positions as $position) {
      ($position['date'] == $order['date']) ? unset($position['date']) : '';   
    }
    

    希望能帮到你。 :)

    【讨论】:

      【解决方案3】:

      假设您要删除$position['date'] 值;而不是使用unset($positions[$key]),您可以执行以下操作:

      foreach ($positions as $key => $position) {
          if ($position['date'] == $order['date']) {
              unset($position['date']);
          }    
      }
      

      NB:我删除了 foreach 循环中的引用,因为根据您的示例,它没有被使用并且可能导致意外行为 (PHP foreach by reference causes weird glitch when going through array of objects)。

      【讨论】:

        猜你喜欢
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多