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

问题描述 投票:1回答:2

我有以下代码:

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数组。

php opencart
2个回答
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 );
   });

0
投票

[$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

© www.soinside.com 2019 - 2024. All rights reserved.