0

我正在使用 simple_html_dom 解析页面并返回一些内容。

当我尝试在 foreach 循环中使用 print_r 输出内容时,它会返回所有元素。但是,如果我尝试将内容输出到文本文件,它只会输出最后一个元素。我究竟做错了什么?

这是我的示例代码:

include 'simple_html_dom.php';

$partlist_file = $_SERVER['DOCUMENT_ROOT'].'/partlist.txt';

$partlist = file('knn-partnumberlist.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$stock = '';

    $output_first = '';
    foreach($partlist as $parts => $part) {

        $html = file_get_html('search/product.aspx?prod=' . $part);
        $ret = $html->find('span#cph_lb_stock_buy'); 

        foreach($ret as $element) {
            $stock = $element->plaintext;
            $stock = preg_replace(array('/\\n/','/\\r/'),'',$stock);
            $stock = trim($stock);
            if($stock == 'Not in stock.') {
                $stock = '0';
            } elseif($stock == 'In Stock & Ready to Ship!') {
                $stock = '6';
            }



        $output = 'K33' . $part . ',' . $stock . "\n";
        print_r ($output); // returns all elements
        file_put_contents($partlist_file, $output); // only returns last element

        }
    }

print_r 输出示例:

K3300283,6
K3301518,6
K3301988,6
K3303351,6
K3303365,6

file_put_contents 输出示例:

K3303365,6
4

2 回答 2

1

您需要为每次迭代连接 $output,而不是简单地覆盖它

 $output .= 'K33' . $part . ',' . $stock . "\n";
        print_r ($output);
        file_put_contents($partlist_file, $output);

.是连接运算符

于 2015-07-30T06:05:39.730 回答
0

print_r 函数有一个布尔选项,允许将其作为字符串变量返回,而不是将其打印到屏幕上。它的用法是这样的:

$myVar = print_r($otherVar, true);

这将允许您收集值,而不是将其直接打印到输出缓冲区(例如屏幕)。这将证明是有用的,因为您现在可以根据需要或希望操纵该值。

此外,file_put_contents 还有一个选项,允许您附加到文件,而不是覆盖它的当前内容。同样,用法如下所示:

$dummy = file_put_contents('path/to/file', $varToSave, FILE_APPEND);

最后一个选项是一个整数位标志(我不知道它的实际值),它告诉 PHP 将新数据添加到文件末尾,而不是用新数据替换当前内容。在您的原始代码中,这两个选项的使用将如下所示:

include 'simple_html_dom.php';

$partlist_file = $_SERVER['DOCUMENT_ROOT'].'/partlist.txt';

$partlist = file('knn-partnumberlist.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$股票='';

$output_first = '';
foreach($partlist as $parts => $part) {

    $html = file_get_html('search/product.aspx?prod=' . $part);
    $ret = $html->find('span#cph_lb_stock_buy'); 

    foreach($ret as $element) {
        $stock = $element->plaintext;
        $stock = preg_replace(array('/\\n/','/\\r/'),'',$stock);
        $stock = trim($stock);
        if($stock == 'Not in stock.') {
            $stock = '0';
        } elseif($stock == 'In Stock & Ready to Ship!') {
            $stock = '6';
        }



    $output = 'K33' . $part . ',' . $stock . "\n";
    $display = print_r ($output, true);
    // you can manipulate $display here, like so:
    $display = str_replace("\n", "\r\n", $display);
    echo $display; // returns all elements (one at a time)
    file_put_contents($partlist_file, $display, FILE_APPEND); // now stores all values of $output in the file

    }
}

当然,看起来你真的不需要在脚本中操作 $output 的值,但是为了说明 print_r 中选项的用处,我放入了一行代码,用于替换 Linux 换行符 (\n ) 与 Windows 换行符 (\r\n),以便像记事本这样的程序可以正确显示文本(PHP 的 print_r 函数仅在输出中放置 \n 换行符,即使在 Windows 机器上也是如此,这就是我找到这篇文章的原因。我正在尝试找到纠正这种行为的方法)。目前这可能对您没有用,但它可能会在以后,并且可能对遇到此问题的其他人有用。我希望这有帮助。:)

于 2016-02-29T05:38:01.250 回答