【问题标题】:PHP + XPath + fputcsv - Storing data in arraysPHP + XPath + fputcsv - 将数据存储在数组中
【发布时间】:2012-05-02 18:45:33
【问题描述】:

我正在使用 DOM/Xpath 解析一些 HTML,最终目标是使用我通过查询获取的数据生成一个 .CSV 文件。

下面的当前代码有效,但只返回最后一个产品名称。我知道我在这里有点在正确的轨道上,但我已经筋疲力尽,无法弄清楚这一点。任何帮助将不胜感激。谢谢。

$names = array();
$result = $xpath->query("//div[@class='product-name']");
foreach ($result as $nam) {
$names[] = $nam->nodeValue;
$i = 0;
$values=$names[$i] = $nam->nodeValue;
}

$list = array (
    array('Product Name','Stock Level','Price'),
    array($values, '456', '789'),
);

$fp = fopen('product-sheet.csv', 'w');

foreach ($list as $fields) {
    fputcsv($fp, $fields);
}

fclose($fp);

【问题讨论】:

    标签: php arrays xpath fputcsv


    【解决方案1】:

    我不完全确定您想要实现什么,但希望这会让您更接近您的目标。

    <?php
    
            //mocked up input, substitute for your HTML source
            $input = "<html>
                        <div class='product-name'>test1</div>
                        <div class='product-name'>test2</div>
                        <div class='product-name'>test3</div>
                        <div class='product-name'>test4</div>
                        <div class='product-name'>test5</div>
                    </html>";
    
            $doc = new DOMDocument();
            @$doc->loadHTML($input);
            libxml_use_internal_errors(FALSE);
            $xpath = new DomXPath($doc);
    
            $list = array (
                array('Product Name','Stock Level','Price')
            );
    
            $result = $xpath->query("//div[@class='product-name']");
    
            foreach ($result as $nam) {
                $value = $nam->nodeValue;
                $list[] = array($value, '456', '789');  //Appends an array to the lists array
            }
    
            $fp = fopen('product-sheet.csv', 'w');
    
            foreach ($list as $fields) {
                fputcsv($fp, $fields);
            }
    
            fclose($fp);
    
        ?>
    

    【讨论】:

      【解决方案2】:

      问题是您在循环中设置了 $i。

      foreach ($result as $nam) {
      $names[] = $nam->nodeValue;
      $i = 0;
      $values=$names[$i] = $nam->nodeValue;
      }
      

      在每次迭代中,$i 都被重置为 0。请尝试以下操作:

      for($i=0; $i< count($result); $i++) {
          $names[] = $result->nodeValue;
          $values=$names[$i] = $result->nodeValue;
      }
      

      【讨论】:

      • 我不确定你要做什么对不起。你能详细描述一下你的目标吗?特别是关于那些数组;您希望它们的结构如何?
      猜你喜欢
      • 2022-10-17
      • 2012-07-19
      • 2013-08-14
      • 2016-10-09
      • 2016-07-10
      • 1970-01-01
      • 2010-12-19
      • 2019-11-27
      • 2012-11-16
      相关资源
      最近更新 更多