【问题标题】:foreach subiteration considers only last elementforeach 子迭代只考虑最后一个元素
【发布时间】:2020-05-19 15:01:45
【问题描述】:

我有以下代码:

foreach ($params as $param)
{
    foreach ($exclude_by_attribute as $exc)
    {
        if ($param['name']==$exc)
        {
            unset($param['name']);
            unset ($param);
        }
    }
} 

但它只取消设置最后一个元素。 if 语句中的元素取自另一个数组。如何删除所有元素?另外我会放一些示例 xml 数据:

<offer id="lyustra_sl113_303_03" type="vendor.model" available="true">
<picture>http://vokruglamp.ru/export/img/422/27059a11c58ade9b03bde05c2ca7c285.jpeg</picture>
<name>someName</name>
<vendor>ST Luce</vendor>
<url>http://somesite.com/catalog/product/lyustra_sl113_303_03/</url>
<currencyId>RUB</currencyId>
<categoryId>188</categoryId>
<image>http://somesite.com/export/img/422/27059a11c58ade9b03bde05c2ca7c285.jpeg</image>
<param name="code">1111</param>
<param name="brand">ST Luce</param>
<param name="someparam">value</param>
<param name="another">value</param>

我想删除其中的一些段落。基于 exclude_by_attribute 数组。

【问题讨论】:

  • 不确定unset ($param); 是否应该在里面。
  • 奈杰尔是正确的答案
  • 是的。对不起。 params 数组来自 simpleXml 对象。对我来说,它就像 $param 一样保持 $param['name'] 的值。
  • 如果你想删除基于某个属性的元素,你可以试试unset ($param[0]);
  • 谢谢。但这样我会收到节点不再存在的警告。

标签: php opencart


【解决方案1】:

所以修改你的代码:

   foreach ($params as $key => $param)
    {
        foreach ($exclude_by_attribute as $exc)
        {
            if ($param['name']==$exc)
            {
                unset ($params[$key]);
                break; 

            }
        }
    }

为了更好的编码,你应该使用 array_filter

$result = array_filter($params, function($val) use ($exclude_by_attribute) {
    return !in_array($val,$exclude_by_attribute );
   });

【讨论】:

  • 对不起,但没有运气。 foreach 循环只是挂起。功能不起作用。只有最后一个元素被删除。
【解决方案2】:

$param 是子数组的副本,因此取消设置它的元素不会修改原始 $params 数组。

使用引用变量使其更新原来的子数组:

foreach ($params as &$param)

另外,将unset($param); 退出循环,因为这会破坏参考链接。您应该在循环完成后执行此操作。

由于$params是一个生成器,所以你首先要把它变成一个数组。

$params_array = [];
foreach ($params as $param) {
    $params_array[] = $param;
}

然后在脚本的其余部分使用$params_array,包括上面取消设置元素的循环。

您也可以用in_array() 函数替换内部循环。

<?php

$params_array = [
    ['name' => 'code', 'value' => 1],
    ['name' => 'brand', 'value' => 2],
    ['name' => 'someparam', 'value' => 3],
    ['name' => 'another', 'value' => 4]
];

$exclude_by_attribute = ['brand', 'someparam'];

foreach ($params_array as &$param) {
    if (in_array($param['name'], $exclude_by_attribute)) {
        unset($param['name']);
    }
}

unset($param);
print_r($params_array);

DEMO

【讨论】:

  • 对不起,但现在我遇到致命错误:迭代器不能通过引用与 foreach 一起使用
  • 我假设$params 是一个数组。见stackoverflow.com/questions/29798586/…
  • 很抱歉,但这并没有多大帮助。这让我一开始就陷入了这种情况。
  • 创建一个生成器值数组,然后对其进行迭代。
  • 原地修改生成器没有意义。
猜你喜欢
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多