【问题标题】:PHP Multidimensional Array Iterating From Text FilePHP多维数组从文本文件迭代
【发布时间】:2017-11-13 19:36:14
【问题描述】:

我有一个名为 C.txt 的文本文件。文本文件的内容如下:

名称、BPrice、SPrice、显示
诺基亚 520、20000、21000、1
小米123、15000、17000、0
小米红米, 30000, 32000, 1

我使用以下代码访问了该文件:

<?php

    $file = fopen("C.txt", "r");
    while(!feof($file)){
        $content = fgets($file);
        $products[] = $content;
    }

    var_dump($products);

?>

var_dump($products) 给出输出:

array(4) { [0]=> string(33) "名称, BPrice, SPrice, Display " [1]=> string(29) "诺基亚 520, 20000, 21000, 1 " [2]=> string(29) "小米123, 15000, 17000, 0 " [3]=> string(30) "小米红米, 30000, 32000, 1 " }

我想要做的是将 Name、BPrice、SPrice 和 Display 列和它们的值使用explode() 方法。所以,我尝试了以下方法:

<?php

        for($i=1; $i<count($products); $i++){

              $contents[] = explode(",", $products[$i]);

        }

        var_dump($contents);

?>

var_dump($contents) 产生:

array(3) { [0]=> array(4) { [0]=> string(9) "诺基亚 520" [1]=> string(6) " 20000" [2]=> string( 6) " 21000" [3]=> string(5) " 1 " } [1]=> array(4) { [0]=> string(9) "小米123" [1]=> string(6) " 15000" [2]=> 字符串(6) " 17000" [3]=> 字符串(5) " 0 " } [2]=> 数组(4) { [0]=> 字符串(12) "小米红米" [1]=> 字符串(6) " 30000" [2]=> 字符串(6) " 32000" [3]=> 字符串(3) " 1 " } }

注意:我只想访问列的值而不是标题,因此for($i=1; $i&lt;count($products); $i++)

现在这是我面临的问题。如何访问这个二维数组$contents?
我试过foreach loop如下:

foreach ($contents as $key => $value) {
    echo $value[$key];
}

但这会导致:

诺基亚 520 15000 32000

我似乎无法弄清楚为什么它不打印其余两行!任何帮助将不胜感激。提前致谢! :)

【问题讨论】:

标签: php string file multidimensional-array foreach


【解决方案1】:

您的问题出在echo $value[$key];。 此上下文中的 $key 变量保存当前 $contents 数组成员的键,而您正在使用它来访问内部数组的值,即产品数据。

由于这是一个多维数组,您需要多次循环才能将其全部打印出来。所以如果你想这样做,它会像这样工作:

foreach ($contents as $productValues) {
    foreach ($productValues as $productValue) {
        echo $productValue;
    }
    echo PHP_EOL;
}

【讨论】:

    【解决方案2】:

    尝试使用此函数将 cvs 文件解析为关联数组,其中列名作为数组键:

    function csvArray($file) {
        $csv = array_map('str_getcsv', file($file));
        array_walk($csv, function(&$a) use ($csv) {
          $a = array_combine($csv[0], $a);
        });
        array_shift($csv);
    return $csv;
    }
    

    那么结果

    $phones = csvArray('c.txt');
    print_r($phones);
    

    是:

    Array
    (
        [0] => Array
            (
                [Name] => Nokia 520
                [ BPrice] =>  20000
                [ SPrice] =>  21000
                [ Display] =>  1
            )
    
        [1] => Array
            (
                [Name] => Xiaomi123
                [ BPrice] =>  15000
                [ SPrice] =>  17000
                [ Display] =>  0
            )
    
        [2] => Array
            (
                [Name] => Xiaomi Redmi
                [ BPrice] =>  30000
                [ SPrice] =>  32000
                [ Display] =>  1
            )
    
    )
    

    【讨论】:

      【解决方案3】:

      用更易读的术语来说,你的数组看起来像这样

      [["Nokia 520", "20000", "21000", "1"], 
       ["Xiaomi123", "15000", "17000", "0"], 
       ["Xiaomi Redmi", "30000", "32000", "1"]]
      

      这意味着在您的foreach 中,您的第一个键的值 是

      ["Nokia 520", "20000", "21000", "1"]
      

      你只得到这些值的原因是你正在做

      echo $value[$key];
      

      所以本质上你是在返回["Nokia 520", "20000", "21000", "1"]的01和2的位置,它们是Nokia 520、20000和21000的值

      要得到你真正想要的值,你需要执行两个foreach循环

      foreach ($arr as $keys) {
          foreach($keys as $value) {
              echo "{$value} ";
          }
          echo "\n";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-23
        • 2020-03-21
        • 1970-01-01
        • 2013-11-11
        • 2023-03-08
        • 2014-05-17
        • 1970-01-01
        相关资源
        最近更新 更多