为什么array_unique不返回给我一个独特的项目列表?

时间:2012-06-22 18:00:20

标签: php web-scraping array-unique

我正在尝试抓取客户端网站主页上的所有网址,以便将其迁移到wordpress。问题是我似乎无法得到重复数据删除的网址列表。

以下是代码:

$html = file_get_contents('http://www.catwalkyourself.com');

$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $hrefs->length; $i++) {
   $href = $hrefs->item($i);
   $url = $href->getAttribute('href');

   if($url = preg_match_all('((www|http://)(www)?.catwalkyourself.com\/?.*)', $url, $matches[0])){
    $urls = $matches[0][0][0];
    $list = implode( ', ', array_unique( explode(", ", $urls) ) );
    echo $list . '<br/>';
    //print_r($list);
   }
}

(同时发布here。)

相反,我得到这样的重复:

http://www.catwalkyourself.com/rss.php
http://www.catwalkyourself.com/rss.php

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

现在使用循环构建代码的方式,您始终使用数组大小​​为1调用array_unique

您需要构建一个URL列表,然后调用array_unique。试试这个:

<?php

$html = file_get_contents('http://www.catwalkyourself.com');

$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
$urls  = array();

for ($i = 0; $i < $hrefs->length; $i++) {
    $href = $hrefs->item($i);
    $url  = $href->getAttribute('href');

    if( ($count = preg_match_all('((www|http://)(www)?.catwalkyourself.com\/?.*)', $url, $matches[0])) > 0) {
        $urls[] = $matches[0][0][0]; // build list of URLs in the loop
    }
}

$list = implode( ', ', array_unique( $urls ) );
echo $list . '<br/>';

答案 1 :(得分:1)

代码的最后一部分不应该在循环中。您正在遍历包含页面上每个链接的数组。由于此数组的每个元素只包含一个链接,因此您将array_unique应用于不能包含多个元素的数组。

尝试这样的事情:

$html = file_get_contents('http://www.catwalkyourself.com');

$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
$urls = array();

for ($i = 0; $i < $hrefs->length; $i++) {
    $href = $hrefs->item($i);
    $url = $href->getAttribute('href');

    if($url = preg_match_all('((www|http://)(www)?.catwalkyourself.com\/?.*)', $url, $matches[0])){
        $urls[] = $matches[0][0][0];
    }
}
$list = implode(', ', array_unique($urls));
echo $list . '<br/>';