使用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
相关产品推荐
相关产品推荐

