是否可以在foreach循环或for循环中删除不同的数组索引?

时间:2017-05-02 07:13:07

标签: php arrays loops foreach

这里很少有问题要解答,

1>当我们启动foreach循环时,foreach循环内的对象是否进入本地范围?

foreach($brands as $k=>$b)
        { 


        }

因此,在上面的示例中,当我们循环$品牌时,它会将$品牌存储在本地范围内并进行迭代,以便如果不同的$品牌指数发生变化,例如:$ brand [10]则会抛出错误?

2 - ;我正在努力实现以下解决方案

foreach($brands as $k=>$b)
        { 
           foreach($brands as $key=>$value)
           { 
              if(statement is true)
              {
                unset($brands[$key]);
              }

           }

        }

与问题编号1类似。当我执行foreach循环并删除另一个foreach循环中的索引时,第一个foreach循环会看起来还是在第一个foreach循环中仍然会有删除的索引?或者第一个foreach循环将遍历每个品牌并删除索引,以便在内循环中删除索引时不会迭代它。因此,我想知道这个foreach循环是如何工作的,并且想知道它是否首先存储索引值并迭代它,或者foreach循环是否会查找其本地范围内索引的任何变化。

3 个答案:

答案 0 :(得分:0)

  

1>当我们启动foreach循环时,foreach循环内的对象是否进入本地范围?

PHP只提供两种类型的variable scopes:全局范围和函数范围。

在任何函数之外设置的所有变量都是全局变量;它们属于全局范围,只能在函数之外使用。

函数内设置的所有变量都是局部变量;它们只能在特定功能体内使用。

没有块级范围。您在任何块级语句(foreachforwhileif等)中使用的每个变量都属于包含该块的代码范围(全局)或功能的本地)。

  

2 - ;我正在努力实现以下解决方案

   foreach($brands as $k=>$b)
   { 
      foreach($brands as $key=>$value)
      { 
         if(statement is true)
         {
           unset($brands[$key]);
         }
      }
   }

在枚举其值时添加或删除数组中的元素是不安全的。也许它有效(我没有测试它)但行为可以在不同的PHP版本上改变。

如果您需要枚举数组值并删除其中一些数据值,则最好将要保留的项目复制到新数组中:

// create a temporary array
$copy = array();
// copy the values we need
foreach ($brands as $key => $value) {
    if (statement is false) {
        $copy[$key] = $value;
    }
}
// replace the original with the temporary
$brands = $copy;
// we don't need $copy any more
unset($copy);

或者,更好的是,使用PHP函数array_filter()

$brands = array_filter(
    $brands,
    function ($item) {
        if (should keep $item) {
            return TRUE;
        } else {
            return FALSE;
        }
    }
);

迭代数组元素并将它们中的每一个传递给提供的回调函数。如果函数返回TRUE,则它会复制返回数组中的元素,否则会忽略它。

如果您需要使用相关的键来决定是否必须保留或删除元素,那么您可以将ARRAY_FILTER_USE_BOTH作为第三个参数传递给array_filter()。在这种情况下,它将值和键作为参数传递给回调函数:

$brands = array_filter(
    $brands,
    function ($value, $key) {
        if (should keep $value) {
            return TRUE;
        } else {
            return FALSE;
        }
    },
    ARRAY_FILTER_USE_BOTH
);

答案 1 :(得分:0)

  

当我们启动foreach循环时,foreach循环内的对象是否进入本地范围?

没有。对你的第一个问题。 Php没有块级范围。你的两个循环将处理数组$brands的精确副本。你的变量继承了直接可用的范围,所以如果你在函数中调用上面的代码,它们将具有函数范围或全局范围。

  

当我执行foreach循环并删除另一个foreach循环中的索引时,第一个foreach循环会显示还是第一个foreach循环中仍然会有删除的索引?

是。由于您的循环正在处理同一个变量,因此您在foreach块中所做的任何更改都将反映在其他变量中。这是可能的,因为循环不会并行运行,但是一个循环在逐步执行元素时运行修改内部数组指针,当它离开循环块时,它会重置内部指针,有效地恢复变量以供其他代码使用

答案 2 :(得分:0)

对其他人来说可能不太方便,但我接下来做的就是为我工作。

我将品牌表克隆成两个: $ brands = $ brans2

然后:

foreach($brands as $k=>$b)
{ 
      foreach($brands2 as $key=>$value)
      { 
        if(statement is true)
       {
         unset($brands2[$key]);
       }
    }
unset($brands[$k]);
}