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循环只是挂起。函数不起作用。只有最后一个元素被删除。