多来源URL数组对比与值拆分及重复值分组实现咨询
PHP数组URL按来源归类拆分方案
嘿,我来帮你搞定这个数组拆分的问题!你需要的是把每个URL对应的来源数组(A、B、C)找出来,然后按来源完成归类拆分对吧?咱们可以通过构建一个URL到来源的映射,再根据映射结果整理出不同的分组,比如仅属于单个数组的URL、多个数组共有的URL等等。
实现思路
- 给每个原始数组打上来源标识(A、B、C)
- 构建一个映射数组,用URL作为键,值是该URL所属的来源集合
- 遍历所有原始数组,填充这个映射数组(注意同一个URL在同一数组中重复出现时,来源只记录一次)
- 根据映射数组,把URL按「仅单个来源」「多个来源共有」等规则分组
代码示例
<?php // 你的原始URL数组 $urlsFromA = ['http://www.test.com', 'http://www.example.com', 'http://www.google.com', 'http://www.twitter.com']; $urlsFromB = ['https://www.test.com', 'http://www.example.com', 'http://www.bing.com']; $urlsFromC = ['http://www.test.com', 'http://www.google.com']; // 第一步:构建URL到来源的映射 $urlSources = []; // 处理数组A foreach ($urlsFromA as $url) { if (!isset($urlSources[$url])) { $urlSources[$url] = []; } // 确保同一来源只添加一次 if (!in_array('A', $urlSources[$url])) { $urlSources[$url][] = 'A'; } } // 处理数组B foreach ($urlsFromB as $url) { if (!isset($urlSources[$url])) { $urlSources[$url] = []; } if (!in_array('B', $urlSources[$url])) { $urlSources[$url][] = 'B'; } } // 处理数组C foreach ($urlsFromC as $url) { if (!isset($urlSources[$url])) { $urlSources[$url] = []; } if (!in_array('C', $urlSources[$url])) { $urlSources[$url][] = 'C'; } } // 第二步:按来源分组整理结果 $groupedUrls = [ '仅来自A' => [], '仅来自B' => [], '仅来自C' => [], 'A和B共有' => [], 'A和C共有' => [], 'B和C共有' => [], '三个数组共有' => [] ]; foreach ($urlSources as $url => $sources) { sort($sources); // 排序来源,保证判断逻辑一致 $sourceKey = implode('', $sources); switch ($sourceKey) { case 'A': $groupedUrls['仅来自A'][] = $url; break; case 'B': $groupedUrls['仅来自B'][] = $url; break; case 'C': $groupedUrls['仅来自C'][] = $url; break; case 'AB': $groupedUrls['A和B共有'][] = $url; break; case 'AC': $groupedUrls['A和C共有'][] = $url; break; case 'BC': $groupedUrls['B和C共有'][] = $url; break; case 'ABC': $groupedUrls['三个数组共有'][] = $url; break; } } // 输出查看结果 echo "<pre>"; print_r($groupedUrls); echo "</pre>"; ?>
额外优化提示
如果需要忽略HTTP/HTTPS协议的差异(比如把http://www.test.com和https://www.test.com视为同一个URL),可以添加一个提取域名的辅助函数:
function getDomain($url) { $parsed = parse_url($url); return $parsed['host']; }
之后遍历数组时,用getDomain($url)代替原URL作为映射数组的键即可。
内容的提问来源于stack exchange,提问作者LukeKov
相关产品推荐
相关产品推荐

