将csv文件转换为PHP 2D数组

时间:2018-01-31 19:17:27

标签: php html arrays file csv

我是PHP的新手,并且一直在努力将CSV文件读入2D阵列。我使用以下文件'csv / team.csv':

ID,Nickname,Shirtnumber,Position
1,Jimmy,0,RightBack
2,Mark,3,CentreBack
3,Bryan,17,LeftMidfielder
4,James,23,Striker
5,Andre,69,Goalkeeper

我希望能够:

  1. 显示个人的'姓名','衬衫号码','位置'等 html / css-webpage上的玩家。
  2. 使用PHP函数prev()current()next()在玩家之间导航。
  3. 使用关联键(除了索引键)。
  4. 我的第一段代码看起来像这样:

        $teamdata = file("csv/team.csv");
        foreach ($teamdata as $playerline) {
                $player = explode(",", $playerline);
                list($ID,$Nickname,$Shirtnumber,$Position) = $player;
        { 
        print_r($player); echo "<br>";
        print_r(prev($player)); echo "<br>";
    

    HTML中的结果是:

    Array ( [0] => 5 [1] => Andre [2] => 69 [3] => Goalkeeper )
    

    这看起来很酷。但是,

    1. 为什么list()没有向数组添加关联键?
    2. 为什么prev()不起作用? (PHP没有给出任何错误消息或警告)
    3. 通过介绍$myplayer,我创建了一个$player的数组。

          $teamdata = file("csv/team.csv");
          foreach ($teamdata as $playerline) {
                  $player = explode(",", $playerline);
                  list($ID,$Nickname,$Shirtnumber,$Position) =$player;
              $myplayer[]=$player;
      }   
      
          print_r($player); echo "<br>"; echo "<br>";
          print_r($myplayer); echo "<br>";echo "<br>";
      
          echo $player[1]; echo "<br>";
          echo $player[3]; echo "<br>"; echo "<br>";
          echo $myplayer[1][1]; echo "<br>";
          echo $myplayer[2][1]; echo "<br>";
      

      输出看起来像:

      Array ( [0] => 5 [1] => Andre [2] => 69 [3] => Goalkeeper ) 
      
      Array ( [0] => Array ( [0] => ID [1] => Nickname [2] => Shirtnumber [3] => Position ) 
              [1] => Array ( [0] => 1 [1] => Jimmy [2] => 0 [3] => RightBack ) 
              [2] => Array ( [0] => 2 [1] => Mark [2] => 3 [3] => CentreBack ) 
              [3] => Array ( [0] => 3 [1] => Bryan [2] => 17 [3] => LeftMidfielder ) 
              [4] => Array ( [0] => 4 [1] => James [2] => 23 [3] => Striker ) 
              [5] => Array ( [0] => 5 [1] => Andre [2] => 69 [3] => Goalkeeper ) ) 
      
      Andre
      Goalkeeper
      
      Jimmy
      Mark
      

      这似乎是我所需要的。然而。我问自己这是否是正确的方法,因为:

      1. 无法使用list()函数
      2. 无法使用prev()函数
      3. 用于选择正确的“播放器属性”的编码是“复杂的”,并且可以轻松地进行错误
      4. 我有编程COBOL(lol)和Pascal的背景知识,但PHP(和Java)对我来说是全新的。任何建议都会受到欢迎!

2 个答案:

答案 0 :(得分:1)

  1. list只是为变量分配数组值。
  2. 您可能希望首先提取标题并将其与每行组合以获得关联数组:

    $teamdata = file("csv/team.csv", FILE_IGNORE_NEW_LINES);
    //get and remove first line to use as keys
    $headings = str_getcsv(array_shift($teamdata));
    
    foreach ($teamdata as $playerline) {
            $player = str_getcsv($playerline);
            //combine keys with values
            $result[] = array_combine($headings, $player);
    { 
    
    1. 你在数组上调用prev,但是数组指针已经在第一个元素,因此没有前一个,它返回false。这可以看作:var_dump(prev($result));

答案 1 :(得分:1)

我认为str_getcsv评论包含very laconic solution,但可以使用array_walk $userdata参数进行改进:

array_walk($teamdata, function(&$player, $_, $headers) {
    $player = array_combine($headers, $player);
}, array_shift($teamdata));

这是the demo