【问题标题】:Switching the rows and columns of a PHP array of arrays切换 PHP 数组的行和列
【发布时间】:2014-06-19 20:46:55
【问题描述】:

我有一个用数组填充的数组。主数组中的每个数组都包含从房地产网站抓取的数据。当我将它们输出到 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);

            ?>

【问题讨论】:

  • 如果没有一个函数可以做到这一点,那么写一些foreach循环

标签: php arrays export-to-csv


【解决方案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);

    ?>

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2023-01-11
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多