Php foreach子迭代只考虑最后一个元素

Php foreach子迭代只考虑最后一个元素,php,opencart,Php,Opencart,我有以下代码: foreach ($params as $param) { foreach ($exclude_by_attribute as $exc) { if ($param['name']==$exc) { unset($param['name']); unset ($param); } } } 但它只取消了最后一个元素。如果语句从另一个数组中获取,则中的元素。如何

我有以下代码:

foreach ($params as $param)
{
    foreach ($exclude_by_attribute as $exc)
    {
        if ($param['name']==$exc)
        {
            unset($param['name']);
            unset ($param);
        }
    }
} 
但它只取消了最后一个元素。如果语句从另一个数组中获取,则
中的元素。如何删除所有元素?此外,我还将放置一些示例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>

http://vokruglamp.ru/export/img/422/27059a11c58ade9b03bde05c2ca7c285.jpeg
名字
圣卢斯
http://somesite.com/catalog/product/lyustra_sl113_303_03/
摩擦
188
http://somesite.com/export/img/422/27059a11c58ade9b03bde05c2ca7c285.jpeg
1111
圣卢斯
价值
价值

我想删除其中一些段落。基于exclude_by_属性数组。

$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);

因此修改代码:

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

            }
        }
    }
为了更好地编码,您应该使用数组过滤器

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

不确定
是否未设置($param)应该在那里。奈杰尔这是正确的答案是的。很抱歉参数数组正在从simpleXml对象提交。对我来说,像$param这样的sims保留$param['name']的值。如果你想基于某个属性删除元素,你可以尝试
unset($param[0])谢谢。但这样我会得到一个警告,节点不再存在。很抱歉,但现在我得到了一个致命错误:迭代器不能与foreach by Reference一起使用我假设
$params
是一个数组。看,对不起,但没什么帮助。这让我想到了一个设置,就像在一开始一样。创建一个生成器值数组,然后迭代。在适当的位置修改生成器是没有意义的。抱歉,但运气不好。foreach循环只是挂起。函数不起作用。只有最后一个元素被删除。