【问题标题】:php output not the same after being put in a functionphp在放入函数后输出不一样
【发布时间】:2022-01-12 13:00:22
【问题描述】:

我正在尝试制作一个 php 脚本,从他们的网站上抓取竞争对手产品的价格,我设法拥有一个带有 json 输出的功能性脚本,但是当我想将竞争对手的 url 设为变量时用户输入的,都横着走。

我知道我一定是搞砸了,这实际上是我的第一个 php 脚本。

这是“第一个版本”(有效的版本):

<?php
require 'C:\Users\dgayg\vendor\autoload.php';

use \GuzzleHttp\Client;
use \PHPHtmlParser\Dom;
use \CurrencyDetector\Detector;


$productPairs = [
    'ASICS FUJITRABUCO LYTE' => [
        'RunnerInn' => [
            'url' => 'https://www.runnerinn.com/magasin-running/asics-chaussures-de-femme-asics-fujitrabuco-lyte/138541586/p',
            'selectorPath' => '#total_dinamic'
        ],
        'iRun' => [
            'url' => 'https://www.i-run.fr/chaussures_homme/Trail_c15/Asics_m1/Asics-FujiTrabuco-Lyte-M_Asics_fiche_92311.html',
            'selectorPath' => '.price'
        ],
        'Zalando' => [
            'url' => 'https://www.zalando.fr/asics-gel-trabuco-terra-chaussures-de-running-deep-sea-tealblazing-coral-as141a0r6-k11.html',
            'selectorPath' => 'span.uqkIZw.ka2E9k.uMhVZi.dgII7d._6yVObe._88STHx.cMfkVL'
        ]
    ]
];

$detector = new Detector();

$comparison = [];

foreach ($productPairs as $productName => $pair) {


    foreach($pair as $provider => $product) {

        $client = new Client();
        $parser = new Dom;

        $request = $client->request('GET', $product['url']);
        $response = (string) $request->getBody();
        $parser->loadStr($response);
        $price = $parser->find($product['selectorPath'])[0];
        $priceString = $price->text;

        $fmt = new NumberFormatter( 'fr_FR', NumberFormatter::CURRENCY );

        $comparison[$productName][$provider] = [
            'Prix' => $detector->getAmount($priceString)." ".$detector->getCurrency($priceString)
        ];     

    }
}

echo json_encode($comparison);

它的输出如下:{"ASICS FUJITRABUCO LYTE":{"RunnerInn":{"Prix":"120.26 EUR"},"iRun":{"Prix":"94 EUR"},"Zalando":{"Prix":"76.95 EUR"}}}

现在这是我将代码放入函数并尝试让用户输入 URL 的版本:

<?php

require 'C:\Users\dgayg\vendor\autoload.php';

use \GuzzleHttp\Client;
use \PHPHtmlParser\Dom;
use \CurrencyDetector\Detector;



function comparateur($site1, $site2) {
    return 
        $productPairs = [
            'ASICS FUJITRABUCO LYTE' => [
                'iRun' => [
                    'url' => $site1,
                    'selectorPath' => '.price'
                ],
                'Zalando' => [
                    'url' => $site2,
                    'selectorPath' => 'span.uqkIZw.ka2E9k.uMhVZi.dgII7d._6yVObe._88STHx.cMfkVL'
                ]
            ]
        ];
            $detector = new Detector();

        $comparison = [];

        foreach ($productPairs as $productName => $pair) {


            foreach($pair as $provider => $product) {

                $client = new Client();
                $parser = new Dom;

                $request = $client->request('GET', $product['url']);
                $response = (string) $request->getBody();
                $parser->loadStr($response);
                $price = $parser->find($product['selectorPath'])[0];
                $priceString = $price->text;

                $fmt = new NumberFormatter( 'fr_FR', NumberFormatter::CURRENCY );

                $comparison[$productName][$provider] = [
                    'Prix' => $detector->getAmount($priceString)." ".$detector->getCurrency($priceString)
            ];

            }
        }
    echo json_encode($comparison);

}

// echo comparateur(($_POST['site1']), ($_POST['site2']));

if (isset($_POST['site1']) && isset($_POST['site2'])) {
    $result = comparateur($_POST['site1'], $_POST['site2']);
}
?>
<html>
<body>
    <!-- <p>https://www.i-run.fr/chaussures_homme/Trail_c15/Asics_m1/Asics-FujiTrabuco-Lyte-M_Asics_fiche_92311.html</p>
    <p>https://www.zalando.fr/asics-gel-trabuco-terra-chaussures-de-running-deep-sea-tealblazing-coral-as141a0r6-k11.html</p> -->
    <form action="" method="post">
    <p>iRun: <input type="text" name="site1" value="https://www.i-run.fr/chaussures_homme/Trail_c15/Asics_m1/Asics-FujiTrabuco-Lyte-M_Asics_fiche_92311.html" /></p>
    <p>Zalando: <input type="text" name="site2" value="https://www.zalando.fr/asics-gel-trabuco-terra-chaussures-de-running-deep-sea-tealblazing-coral-as141a0r6-k11.html" /></p>
    <p><input type="submit"/></p>
    <?php if (isset($result)) { ?>
        <h1> Result: <?php print_r($result);?></h1>
    <?php } ?>

</body>
</html>

它的输出如下:Result: Array ( [ASICS FUJITRABUCO LYTE] =&gt; Array ( [iRun] =&gt; Array ( [url] =&gt; https://www.i-run.fr/chaussures_homme/Trail_c15/Asics_m1/Asics-FujiTrabuco-Lyte-M_Asics_fiche_92311.html [selectorPath] =&gt; .price ) [Zalando] =&gt; Array ( [url] =&gt; https://www.zalando.fr/asics-gel-trabuco-terra-chaussures-de-running-deep-sea-tealblazing-coral-as141a0r6-k11.html [selectorPath] =&gt; span.uqkIZw.ka2E9k.uMhVZi.dgII7d._6yVObe._88STHx.cMfkVL ) ) )

谁能告诉我我在哪里搞砸了,因为我真的想不通。

非常感谢!

【问题讨论】:

    标签: php guzzle domparser


    【解决方案1】:

    试试这个,把 echo inside 函数改成 return。

    <?php
    
    function comparateur($site1, $site2) {
        return 
            $productPairs = [
                'ASICS FUJITRABUCO LYTE' => [
                    'iRun' => [
                        'url' => $site1,
                        'selectorPath' => '.price'
                    ],
                    'Zalando' => [
                        'url' => $site2,
                        'selectorPath' => 'span.uqkIZw.ka2E9k.uMhVZi.dgII7d._6yVObe._88STHx.cMfkVL'
                    ]
                ]
            ];
                $detector = new Detector();
    
            $comparison = [];
    
            foreach ($productPairs as $productName => $pair) {
    
    
                foreach($pair as $provider => $product) {
    
                    $client = new Client();
                    $parser = new Dom;
    
                    $request = $client->request('GET', $product['url']);
                    $response = (string) $request->getBody();
                    $parser->loadStr($response);
                    $price = $parser->find($product['selectorPath'])[0];
                    $priceString = $price->text;
    
                    $fmt = new NumberFormatter( 'fr_FR', NumberFormatter::CURRENCY );
    
                    $comparison[$productName][$provider] = [
                        'Prix' => $detector->getAmount($priceString)." ".$detector->getCurrency($priceString)
                ];
    
                }
            }
        return json_encode($comparison); // CHANGE echo to return
    }
    
    // echo comparateur(($_POST['site1']), ($_POST['site2']));
    
    if (isset($_POST['site1']) && isset($_POST['site2'])) {
        $result = comparateur($_POST['site1'], $_POST['site2']);
        echo $result;
    }
    

    【讨论】:

    • 您好,非常感谢您的回答,我刚刚尝试过,但没有成功,您对我可能搞砸的地方还有其他想法吗?
    • 现在成功了!我的错,我忘了删除第一个退货,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2021-08-15
    相关资源
    最近更新 更多