#php #arrays #export-to-csv
#php #массивы #экспорт в csv
Вопрос:
У меня есть массив, заполненный массивами. Каждый массив в основном массиве содержит данные, извлеченные с веб-сайта недвижимости. Когда я вывожу их в файл CSV, я хочу сделать каждую категорию данных (цена, адрес, размер и т. Д.) Отдельным Отдельным столбцом. Прямо сейчас каждая категория хранится в строке. Я просмотрел здесь несколько тем по этому поводу и не могу заставить код работать. Я думаю, это потому, что этот массив не содержит строк, он содержит массивы, каждый из которых содержит строки. Я хотел бы знать, как это сделать. Я попытался выполнить array_flip(), однако он вернул ошибку, в которой говорилось, что массив должен содержать строки или числа.
Вот что у меня есть прямо сейчас:
<?php
//URL HERE
$html = file_get_contents("URL_HERE");
$DOM = new DOMDocument();
libxml_use_internal_errors(true);
$DOM->loadHTML($html);
// price
$pfinder = new DomXPath($DOM);
$classname_p = 'price-large';
$pnodes = $pfinder->query("//*[contains(@class, '$classname_p')]");
$csv_values_p = array();
foreach ($pnodes as $pnode) {
$csv_values_p[] = $pnode->nodeValue;
}
// zestimate
$zfinder = new DomXPath($DOM);
$classname_z = 'zestimate';
$znodes = $zfinder->query("//*[contains(@class, '$classname_z')]");
$csv_values_z = array();
foreach ($znodes as $znode) {
$csv_values_z[] = $znode->nodeValue;
}
// address
$afinder = new DomXPath($DOM);
$classname_a = 'property-address';
$anodes = $afinder->query("//*[contains(@class, '$classname_a')]");
$csv_values_a = array();
foreach ($anodes as $anode) {
$csv_values_a[] = $anode->nodeValue;
}
// property details
$dfinder = new DomXPath($DOM);
$classname_d = 'property-data';
$dnodes = $dfinder->query("//*[contains(@class, '$classname_d')]");
$csv_values_d = array();
foreach ($dnodes as $dnode) {
$csv_values_d[] = $dnode->nodeValue;
}
// lot size
$lfinder = new DomXPath($DOM);
$classname_l = 'property-lot';
$lnodes = $lfinder->query("//*[contains(@class, '$classname_l')]");
$csv_values_l = array();
foreach ($lnodes as $lnode) {
$csv_values_l[] = $lnode->nodeValue;
}
// year built
$yfinder = new DomXPath($DOM);
$classname_y = 'property-year';
$ynodes = $yfinder->query("//*[contains(@class, '$classname_y')]");
$csv_values_y = array();
foreach ($ynodes as $ynode) {
$csv_values_y[] = $ynode->nodeValue;
}
// Master Array:
$outputarray = array($csv_values_p,$csv_values_z,$csv_values_a,$csv_values_d,$csv_values_l,$csv_values_y);
var_dump($outputarray);
// Export to .CSV:
$fp = fopen('propertydata3.csv', "w") or die($php_errormsg);
foreach ($outputarray as $output) {
fputcsv($fp, $output);
}
fclose($fp);
?>
Комментарии:
1. если нет ни одной функции, которая может это сделать, напишите несколько
foreach
циклов
Ответ №1:
Попробуйте это сделать. Я не могу его протестировать, потому что у меня нет никаких данных для его тестирования.
Вы можете столкнуться с проблемами с этим методом, если в данных, которые вы получаете, есть пустые поля.
Если это не решит вашу проблему, изображение выходных данных было бы здорово. Если бы у меня были какие-то данные для работы, это было бы еще лучше.
PHP:
<?php
//URL HERE
$html = file_get_contents("URL_HERE");
$DOM = new DOMDocument();
libxml_use_internal_errors(true);
$DOM->loadHTML($html);
// price
$pfinder = new DomXPath($DOM);
$classname_p = 'price-large';
$pnodes = $pfinder->query("//*[contains(@class, '$classname_p')]");
// zestimate
$zfinder = new DomXPath($DOM);
$classname_z = 'zestimate';
$znodes = $zfinder->query("//*[contains(@class, '$classname_z')]");
// address
$afinder = new DomXPath($DOM);
$classname_a = 'property-address';
$anodes = $afinder->query("//*[contains(@class, '$classname_a')]");
// property details
$dfinder = new DomXPath($DOM);
$classname_d = 'property-data';
$dnodes = $dfinder->query("//*[contains(@class, '$classname_d')]");
// lot size
$lfinder = new DomXPath($DOM);
$classname_l = 'property-lot';
$lnodes = $lfinder->query("//*[contains(@class, '$classname_l')]");
// year built
$yfinder = new DomXPath($DOM);
$classname_y = 'property-year';
$ynodes = $yfinder->query("//*[contains(@class, '$classname_y')]");
//Count one node
$count = count($pnodes);
$outputarray = array();
for($x = 0; $x > $count; $x ){
$tempArray = array();
$tempArray[] = $pnodes[$x];
$tempArray[] = $znodes[$x];
$tempArray[] = $anodes[$x];
$tempArray[] = $dnodes[$x];
$tempArray[] = $lnodes[$x];
$tempArray[] = $ynodes[$x];
$outputarray[] = $tempArray;
}
// Master Array:
//$outputarray = array($csv_values_p,$csv_values_z,$csv_values_a,$csv_values_d,$csv_values_l,$csv_values_y);
var_dump($outputarray);
// Export to .CSV:
$fp = fopen('propertydata3.csv', "w") or die($php_errormsg);
foreach ($outputarray as $output) {
fputcsv($fp, $output);
}
fclose($fp);
?>