You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用explode()创建多维数组时重复值问题的解决方法

问题分析与解决方案

我看了你的代码和需求,问题出在你第二次循环里的逻辑——你错误地嵌套了一个循环foreach ($itemprods as $k =>$attribute),但$itemprods这个变量根本没定义,而且还重复执行了explode,这直接导致了重复值的出现。

接下来给你两种高效的实现方式,既能把一维数组转成以sku_id为键的多维数组,还能自动去重:

方法一:遍历文章时直接构建目标数组(推荐)

这个方法不需要先存一维数组,而是在第一次循环处理文章的时候就直接构建多维数组,既节省内存,又避免后续的二次遍历,效率最高:

// 初始化目标多维数组
$variables = [];

while ($my_query->have_posts()) : $my_query->the_post();
    $post_id = get_the_ID();
    $product = wc_get_product($post_id);
    $sku = $product->get_sku();
    $sku_id = $sku . '_' . $post_id;
    $urltitle = urlencode($product->get_title());
    $url = 'http://www.example.com/search?=' . $urltitle;

    // CURL获取HTML部分保持不变
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $html = curl_exec($ch);
    curl_close($ch);

    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $f = null;
    $tempItems = []; // 临时存当前sku_id的条目,避免重复

    foreach($dom->getElementsByTagName('a') as $link) {
        $linkText = $link->nodeValue;
        // 查找包含'Over $'的节点值
        if (strpos($linkText, 'Over $') !== false) {
            $f = 1;
            continue; // 跳过这个节点本身,因为我们要收集之后的
        }
        // 收集'Over $'之后的前4个节点值
        if (!empty($f)) {
            if ($f > 1) {
                // 先检查是否已经存在,避免重复
                if (!in_array($linkText, $tempItems)) {
                    $tempItems[] = $linkText;
                }
            }
            $f++;
        }
        // 收集够4个就停止
        if ($f == 6) {
            break;
        }
    }

    // 将临时数组赋值给对应的sku_id键
    if (!empty($tempItems)) {
        $variables[$sku_id] = $tempItems;
    }

    $f = null;
endwhile;

方法二:基于已有的一维数组转换并去重

如果你已经有了那个一维数组$array,可以用下面的代码快速处理,避免重复:

$variables = [];

foreach ($array as $item) {
    list($value, $skuId) = explode('|', $item);
    // 检查当前skuId对应的数组里是否已经有这个值,没有才添加
    if (!isset($variables[$skuId]) || !in_array($value, $variables[$skuId])) {
        $variables[$skuId][] = $value;
    }
}

// 可选:重置子数组的索引,让索引从0开始连续
foreach ($variables as &$subArray) {
    $subArray = array_values($subArray);
}
unset($subArray); // 释放引用,避免后续变量污染

为什么你的原代码会出现重复?

你原代码里的第二个foreach ($itemprods as $k =>$attribute)完全是多余的,而且$itemprods未定义,这会导致循环不执行或者报错;同时你重复调用explode,逻辑混乱,最终导致重复添加值。

上面两种方法都能得到你想要的目标结构,而且自动去除了子数组里的重复值。

内容的提问来源于stack exchange,提问作者bbruman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:35:51