【问题标题】:Array only printing last value [duplicate]数组只打印最后一个值[重复]
【发布时间】:2017-12-27 06:14:28
【问题描述】:

考虑以下 php 代码,它正在为客户的电子邮件抓取客户的旧静态网站...

$urls = explode(PHP_EOL, file_get_contents('urls.txt'));

print '<pre>'; print_r($urls); print '</pre>';

print '<strong>Results:</strong><br>';

function get_emails($url) {
    $html = file_get_contents($url);
    
    $dom = new DOMDocument;
    @$dom->loadHTML($html);
    $links = $dom->getElementsByTagName('a');

    foreach ($links as $link){
        $href = $link->getAttribute('href');
        if (strpos($href, 'mailto') !== false) {
            return str_replace("mailto:","",$href) . '<br>';
        }
    }
}
    
foreach ($urls as $key => $url) {
  print get_emails($url);
}

我正在从 urls.txt 读取 url 列表,但结果只是文件中最后一个 url 之一。所有其他的都被忽略了。我曾希望它会返回他所有客户 url 的一个很好的列表,以便我们可以将它们导入新站点。

有人可以帮助诊断问题吗?

【问题讨论】:

  • 为什么要在 foreach 循环中返回?回声...
  • 刚刚更新为 echo,同样的事情还在发生——只得到最后一个结果
  • 那么您的数组中只有一件事与您的 if 语句匹配,注释掉 if 语句并尝试使用 echo :)
  • 试过了,如果我一次只将每个 url 放入 urls.txt 中,我会得到每个的结果,因此脚本适用于单个 url,但只有在如果它们作为数组输出
  • hm,你能 var_dump 你的数组并用输出编辑问题吗?

标签: php loops


【解决方案1】:

这是因为:-

return str_replace("mailto:","",$href) . '<br>';

它将终止循环的执行。

1.要么做:-

$urls = explode(PHP_EOL, file_get_contents('urls.txt'));

print '<pre>'; print_r($urls); print '</pre>';

print '<strong>Results:</strong><br>';

function get_emails($url) {
    $html = file_get_contents($url);

    $dom = new DOMDocument;
    @$dom->loadHTML($html);
    $links = $dom->getElementsByTagName('a');

    foreach ($links as $link){
       $href = $link->getAttribute('href');
       echo str_replace("mailto:","",$href) . '<br>';
    }
}

foreach ($urls as $key => $url) {
  get_emails($url);
}

2.或执行以下操作:-

$urls = explode(PHP_EOL, file_get_contents('urls.txt'));

print '<pre>'; print_r($urls); print '</pre>';

print '<strong>Results:</strong><br>';

function get_emails($url) {
    $html = file_get_contents($url);
    $data = array(); //define array
    $dom = new DOMDocument;
    @$dom->loadHTML($html);
    $links = $dom->getElementsByTagName('a');

    foreach ($links as $link){
        $href = $link->getAttribute('href');
        $data[] = str_replace("mailto:","",$href) . '<br>'; //assign  each value to the array

    }
   return $data;
}

foreach ($urls as $key => $url) {
  print_r(get_emails($url));
}

【讨论】:

  • 刚刚尝试过,仍然得到相同的结果 :-( - 加上终止意味着我只得到第一个结果?我现在只得到最后一个结果
  • 选项 1 只返回最后一个结果,选项 2 没有返回任何内容。嗯,我认为你正在做一些事情,看起来我可能会用每个循环覆盖一个变量,这就是为什么只有最后一个显示
  • 使用选项 2,我在 print_r 中得到这个结果... Array ( ) Array ( [0] => Info@mysite.com )
  • @Collins 你能告诉我print_r($links); 的输出吗?把它放在$links = $dom-&gt;getElementsByTagName('a'); 之后并检查并显示它的输出?
  • 奇怪,它现在决定使用选项 1 开始工作。感谢您的帮助,这有点让人头疼!
猜你喜欢
  • 2015-06-23
  • 2022-01-23
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2014-01-07
  • 2020-03-10
相关资源
最近更新 更多