我有以下代码:
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数组。
因此修改您的代码:
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 );
});
[$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);