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);

これにより、出力バッファ (例: screen) に値を直接出力するのではなく、値を収集できます。これは、必要に応じて、または必要に応じて値を操作できるという点で便利です。

さらに、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 関数は、Windows マシンでも出力に \n 改行しか配置しないため、この投稿を見つけました。試していました。その動作を修正する方法を見つけるため)。現時点では役に立たないかもしれませんが、後でこの質問に出くわした他の人にとって役立つかもしれません. これが役立つことを願っています。:)

于 2016-02-29T05:38:01.250 に答える