Мой цикл foreach PHP выводит print_r правильно, но не file_put_contents

Я использую simple_html_dom для анализа страницы и возврата некоторого содержимого.

Когда я пытаюсь вывести содержимое с print_r в цикле foreach, он возвращает все элементы. Однако, если я пытаюсь вывести содержимое в текстовый файл, он выводит только последний элемент. Что я делаю неправильно?

Вот мой пример кода:

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

0

Решение

Вам нужно объединить $ output для каждой итерации, без перезаписи

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

. является оператором конкатенации

1

Другие решения

Функция 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);

$ 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";
$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), чтобы такие программы, как Блокнот, могли правильно отображать текст (функция print_r в PHP помещает \ n только новые строки в вывод, даже на компьютерах с Windows, поэтому я нашел этот пост. Я пытался чтобы найти способ исправить это поведение). Это может оказаться не очень полезным для вас в настоящее время, но может позже и может оказаться полезным для других, кто сталкивается с этим вопросом. Надеюсь, это поможет. 🙂

0

По вопросам рекламы [email protected]