【问题标题】:for each empties my array(noob)对于每个清空我的数组(菜鸟)
【发布时间】:2016-06-26 19:52:34
【问题描述】:

首先,您可能会从我的代码中得到我是一个菜鸟,并试图构建一个链接爬虫,它在页面中搜索链接 -> 然后跟踪每个链接并将链接放入数组中。最后,我们应该拥有在该网站上找到的所有链接。

代码如下所示:

<?php

$to_crawl = "http://reteteculinare.ro";
$c = array();
$final = array();

function get_Links($to_crawl){
    global $c, $final;
    $input = @file_get_contents($to_crawl);
    $base_url = parse_url($to_crawl, PHP_URL_HOST);

    $regexp = '<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>';
    preg_match_all("/$regexp/siU", $input, $matches);

    $l = $matches[2];

    foreach ($l as $link) {

        if(strpos($link, "#")) {

            $link = substr($link, 0, strpos($link, "#"));

        }

        if(substr($link, 0, 1) == "."){

            $link = substr($link, 1);

        }

        if(substr($link, 0, 7) == "http://"){

            $link = $link;

        } else if (substr($link, 0, 8) == "https://"){

            $link = $link;

        } else if (substr($link, 0, 4) == "www."){

            $link = substr($link, 4);

        } else if (substr($link, 0, 6) == "//wwww."){

            $link = substr($link, 6);

        } else if (substr($link, 0, 2) == "//"){

            $link = substr($link, 2);

        } else if (substr($link, 0, 1) == "#"){

            $link = $to_crawl;

        } else if (substr($link, 0, 7) == "mailto:"){

            $link = "[".$link."]";

        } else {

            if(substr($link, 0, 1) != "/") {

                $link = $base_url."/".$link;

            } else {

                $link = $base_url.$link;

            }

        }

        if(substr($link, 0, 4) == "www."){

                $link = substr($link, 4);

        } 

        if(substr($link, 0, 7) != "http://" && substr($link, 0, 8) != "https://" && substr($link, 0, 1) != "[") {

            $link = "http://".$link;

        }

        if (!in_array($link, $c)) {

            array_push($c, $link);

        }


    }

}

get_links($to_crawl);

foreach ((array)$c as $page) {

    get_links($page);

    foreach ((array)$c as $page) {

        if (!in_array($page, $final)) {

            $final[] = $page;
            echo '<pre>';
            print_r($final);
            echo '</pre>';
        }

    }

}

?>

当前代码中的问题是每次添加新页面时它都会打印数组,我们会得到这样的结果:

Array
(
    [0] => http://reteteculinare.ro/autentificare/
)
Array
(
    [0] => http://reteteculinare.ro/autentificare/
    [1] => http://reteteculinare.ro/inregistrare/
)
Array
(
    [0] => http://reteteculinare.ro/autentificare/
    [1] => http://reteteculinare.ro/inregistrare/
    [2] => http://reteteculinare.ro/
)
Array
(
    [0] => http://reteteculinare.ro/autentificare/
    [1] => http://reteteculinare.ro/inregistrare/
    [2] => http://reteteculinare.ro/
    [3] => http://reteteculinare.ro/retete/
)
Array
(
    [0] => http://reteteculinare.ro/autentificare/
    [1] => http://reteteculinare.ro/inregistrare/
    [2] => http://reteteculinare.ro/
    [3] => http://reteteculinare.ro/retete/
    [4] => http://reteteculinare.ro/mixer-ingrediente/
)
Array
(
    [0] => http://reteteculinare.ro/autentificare/
    [1] => http://reteteculinare.ro/inregistrare/
    [2] => http://reteteculinare.ro/
    [3] => http://reteteculinare.ro/retete/
    [4] => http://reteteculinare.ro/mixer-ingrediente/
    [5] => http://reteteculinare.ro/reteta_saptamanii/
)
...

注意:-尝试将打印放在第二个 foreach 的末尾,我仍然得到多个数组。 - 尝试在第一次 foreach 之后打印,它不输出任何内容。

我做错了什么,如何在所有脚本完成后打印 $final 数组?

干杯!

【问题讨论】:

  • foreach结束后打印。
  • 如果我在第二次 foreach 之后打印它,我仍然会得到超过 1 个数组。如果我在第一次 foreach 之后打印它,则数组为空..

标签: php arrays foreach


【解决方案1】:

将您的print_r($final); 移出foreach

【讨论】:

  • 如果我在第一次 foreach 打印功能之后移动,我仍然会得到更多带有添加页面的数组,如果我在第二次 foreach 之后移动它,我会得到一个空数组。
  • 那么你的问题是什么。在第一次 foreach 之后打印你的结果
  • 试图实现仅包含所有链接的 1 个数组,如果将打印放在第二个数组之后,我会得到超过 1 个数组,如果在第一个数组之后我什么都没有..
猜你喜欢
  • 2018-09-13
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
相关资源
最近更新 更多