用于双元素的PHP过滤器数组

时间:2016-05-09 07:39:03

标签: php arrays array-difference

我有一个问题。 我有一个充满外部链接的数组,如:

www.google.de
www.google.com/test

等等。 不,我想让阵列填满。 如果数组中有链接,如下所示:

www.google.de
www.google.de/test
www.google.de/fuuuu

我只想获取www.google.de链接并过滤掉其余部分。 我首先使用array_diff_key,但这不应该像它应该的那样工作。 这是我的片段。

$d_array = array_diff_key($externalArray, array_unique($externalArray));

感谢您的帮助。 伟人, Traxstar

3 个答案:

答案 0 :(得分:1)

最后,我做到了:

$arr = [
    'www.google.de',
    'http://www.google.de/test',
    'www.google.de/fufufufu',
    'www.google.com/cctvvmb',
    'https://www.google.com/',
    'google.co.uk/hello',
];


// based on http://stackoverflow.com/questions/1201194/php-getting-domain-name-from-subdomain
function get_domain($url)
{
    if(preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $url, $regs))
    {
        return $regs['domain'];
    }

    return false;
}

function get_duplicated_domains($arr)
{
    $domains = [];

    // looping the array, processing all of it
    foreach($arr as $url)
    {
        // lower text
        $url = strtolower($url);

        // removing eventual http & https
        $url = str_replace('http://', '', $url);
        $url = str_replace('https://', '', $url);

        // replacing with the string before the first slash
        $url = explode('/', $url);

        // extracting top level domain
        $url = get_domain($url[0]);

        // Registering domain in $domains array or incrementing it
        if(array_key_exists($url, $domains))
        {
            $domains[$url]++;
        }
        else
        {
            $domains[$url] = 0;
        }
    }

    // gathering data
    return array_keys(array_filter($domains));
}

$res = get_duplicated_domains($arr);

结果是:

Array
(
    [0] => google.de
    [1] => google.com
)

脚本在做什么?

1 - 循环数组

  • 1.1 - 降低网址字符串以防止httpHttp不匹配,例如

  • 1.2 - 删除http://&amp;来自字符串的https://,使其格式相同

  • 1.3 - 提取顶级域名

  • 1.4 - 在提取的顶级域名上注册或递增$domains数组

2 - 过滤数组(0,null,false,空字符串,删除,这就是为什么我将域名注册为0而不是1),只保留&#39;怀疑&#39;域(在数组中出现多次的域)

3 - 然后获取数组的键(因为键是域名)

顺便说一句,我正在运行PHP 5.6.2

答案 1 :(得分:1)

您可以简单地使用parse_url,如:

$externalArray = array_reduce($externalArray, function ($carry, $url) {
    if (strpos($url, 'http') !== 0) {
        $url = 'http://' . $url;
    }

    $host = strtolower(parse_url($url, PHP_URL_HOST));

    if (!in_array($host, $carry)) {
        $carry[] = $host;
    }

    return $carry;
}, array());

答案 2 :(得分:-1)

你也应该尝试这个

第1步:将所有链接转换为一个数组

for

第二步:然后爆炸#34; /&#34;并将它们推入一个数组

$links = array(
    www.google.de,
    www.google.com/test,
    www.google.de/test
    www.google.de/fuuuu
)

步骤3:添加以下功能

$strip = array('http://','https://');
foreach($links as $dividelink){
    $newone = explode("/",str_ireplace($strip,'',$dividelink));
    $newone = $newone[0];
    $newlinksDataArr[] = array(
        "link" => $newone,
    );
    $newone=null;
}

第4步:在此处使用上述功能并获得唯一链接

function unique_multidim_array($array, $key) {
    $temp_array = array();
    $i = 0;
    $key_array = array();

    foreach($array as $val) {
        if (!in_array($val[$key], $key_array)) {
            $key_array[$i] = $val[$key];
            $temp_array[$i] = $val;
        }
        $i++;
    }
    return $temp_array;
}