这里很少有问题要解答,
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循环是否会查找其本地范围内索引的任何变化。
答案 0 :(得分:0)
1>当我们启动foreach循环时,foreach循环内的对象是否进入本地范围?
PHP只提供两种类型的variable scopes:全局范围和函数范围。
在任何函数之外设置的所有变量都是全局变量;它们属于全局范围,只能在函数之外使用。
函数内设置的所有变量都是局部变量;它们只能在特定功能体内使用。
没有块级范围。您在任何块级语句(foreach
,for
,while
,if
等)中使用的每个变量都属于包含该块的代码范围(全局)或功能的本地)。
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]);
}