【问题标题】:return file_get_contents Array in Such way that Array_sum, Min, Max, Count will work?以 Array_sum、Min、Max、Count 的方式返回 file_get_contents Array?
【发布时间】:2014-11-14 11:44:46
【问题描述】:
<?php

$data = file_get_contents('https://www.airbnb.com/s/Prague~Prague-1--Czech-Republic?source=bb');
$regex = '/<span class=\"h3 price-amount\">(.*)span>/';
preg_match_all($regex,$data,$match);

echo 'TOTAL: ' . array_sum($match[1]); //Incorrect
echo 'Minimum: ' . min($match[1]); //Incorrect
echo 'Maximum: ' . max($match[1]); //Incorrect
echo 'Average: ' . array_sum($match[1]) / count($match[1]); //Incorrect
echo 'Number of properties: ' .  count($match[1]); //OK

var_dump($match[1]);结果:

array(18) { 
    [0]=> string(4) "58 
        string(4) "42 
        string(5) "103 
        string(4) "52 
        string(4) "46 
        string(5) "109 
        string(4) "89 
        string(4) "55 
        string(4) "95 
        string(5) "110 
        string(5) "345 
        string(4) "76 
        string(4) "45 
        string(4) "76 
        string(5) "101 
        string(4) "83 
        string(4) "77 
        string(4) "58

var_dump($match[0]); 结果(我也尝试过 [0] 用于 array_sum,但它始终为 0:

array(18) { 
    [0]=> string(39) "62" 
    [1]=> string(39) "42" 
    [2]=> string(39) "52" 
    [3]=> string(39) "54" 
    [4]=> string(39) "58" 
    [5]=> string(39) "46" 
    [6]=> string(39) "89" 
    [7]=> string(40) "122" 
    [8]=> string(40) "103"
    [9]=> string(39) "55" 
    [10]=> string(39) "76" 
    [11]=> string(39) "69" 
    [12]=> string(39) "90" 
    [13]=> string(40) "110" 
    [14]=> string(39) "24" 
    [15]=> string(39) "38" 
    [16]=> string(39) "50" 
    [17]=> string(39) "23" 
}

为什么我不知道出了什么问题,在我看来,数组从正则表达式匹配中返回字符串数字,但数组计算不起作用。

print_r($match[0]);

Array ( 
    [0] => 46 
    [1] => 58 
    [2] => 103 
    [3] => 42 
    [4] => 52 
    [5] => 62 
    [6] => 38 
    [7] => 60 
    [8] => 77 
    [9] => 76 
    [10] => 69 
    [11] => 54 
    [12] => 89 
    [13] => 130 
    [14] => 50 
    [15] => 76 
    [16] => 167 
    [17] => 110 
)

【问题讨论】:

  • 我尝试了您的代码,但这不起作用,因为您的数组中有错误的值:11387&lt;/
  • @lolka_bolka 嗯,你是怎么发现的?是的,正则表达式看起来缺少一些东西

标签: php html arrays


【解决方案1】:

使用这个正则表达式:$regex = '/&lt;span class=\"h3 price-amount\"&gt;(.*)&lt;\/span&gt;/';

您在结束时缺少&lt;\/

并在 min/max 等之前添加这一行...$match[1] = array_map('intval', $match[1]);

输出是:

 TOTAL: 290500
 Minimum: 5820
 Maximum: 29860
 Average: 16138.888888889
 Number of properties: 18

注意:您是否意识到,每次运行脚本时,此页面都会返回不同的值?

【讨论】:

  • 是的,我在您发表评论后看到了这个,但我对您如何调试它感兴趣?谢谢!将尽可能接受您的回答。
  • 只需 var_dump($match); 并检查键 1 的数组。
  • 我正在使用 xdebug,是什么让var_dump()更具可读性
  • 在这种情况下,array_map intval 的作用是什么?关于不同的值(每次访问网站上的不同属性)
  • 没有不同的属性。数组映射只是将字符串转换为数组中的整数。
【解决方案2】:

作为替代方案,在处理此任务时,您还可以使用 HTML Parser DOMDocument,特别是与 xpath 一起使用。

$dom = new DOMDocument;
libxml_use_internal_errors(true);
// load the page
$dom->loadHTMLFile('https://www.airbnb.com/s/Prague~Prague-1--Czech-Republic?source=bb');
libxml_clear_errors();
$xpath = new DOMXpath($dom);

$prices = array();
// get all span with that class
$elements = $xpath->query('//span[@class="h3 price-amount"]');
foreach($elements as $e) { // get all the values and push it inside the array
    $prices[] = intval(trim($e->nodeValue));
}

$total = array_sum($prices); // then array sum them
echo $total;

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 2019-04-10
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2011-11-20
    • 2010-09-24
    相关资源
    最近更新 更多