Переключение строк и столбцов PHP-массива массивов

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

    ?>