Я использую 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
Вам нужно объединить $ output для каждой итерации, без перезаписи
$output .= 'K33' . $part . ',' . $stock . "\n";
print_r ($output);
file_put_contents($partlist_file, $output);
.
является оператором конкатенации
Функция 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, поэтому я нашел этот пост. Я пытался чтобы найти способ исправить это поведение). Это может оказаться не очень полезным для вас в настоящее время, но может позже и может оказаться полезным для других, кто сталкивается с этим вопросом. Надеюсь, это поможет. 🙂