【问题标题】:Convert delimited strings into an associative array将分隔字符串转换为关联数组
【发布时间】:2012-02-13 11:25:00
【问题描述】:

我有一个包含类似记录的文件 codes.txt

USA 0233
JPN 6789
TUN 8990
CDN 2345

我想将文件的这些内容读取到这样的关联数组中。

$codes["USA"] = 0233;
$codes["JPN"] = 6789;
$codes["TUN"] = 8990;
$codes["CDN"] = 2345;

这是打开文件进行写入的代码。我需要数组部分的帮助。谢谢

$myFile = "codes.txt";
$fh = fopen($myFile, 'r');
$theData = fread($fh, filesize($myFile));
fclose($fh)

【问题讨论】:

    标签: php arrays explode csv


    【解决方案1】:

    这很简单。首先逐行读取文件(例如,查看已经执行此操作的 file 函数)。然后通过在第一个空格处拆分每一行来解析每一行(参见explode),使用第一部分作为键,第二部分作为值:

    $array = array();
    foreach (file($myFile) as $line)
    {
        list($key, $value) = explode(' ', $line, 2) + array(NULL, NULL);
    
        if ($value !== NULL)
        {
            $array[$key] = $value;
        }
    }
    

    如果您的解析器需要更具体,请根据您的需要进行更改。有a lot of string functions with PHP 可用于更多差异化的解析,如sscanf 或正则表达式。

    另一种常见的方法是从SplFileObject 扩展,它允许将数据获取封装在一个迭代器中,这样您就可以更好地区分数据的使用位置和获取位置。您可以在另一个答案中找到示例:

    【讨论】:

      【解决方案2】:
      $myFile = "codes.txt";
      $fh = fopen($myFile, 'r');
      $theData = fread($fh, filesize($myFile));
      $assoc_array = array();
      $my_array = explode("\n", $theData);
      foreach($my_array as $line)
      {
          $tmp = explode(" ", $line);
          $assoc_array[$tmp[0]] = $tmp[1];
      }
      fclose($fh);
      
      // well the op wants the results to be in $codes
      $codes = $assoc_array;
      

      【讨论】:

      • 谢谢。我如何获得价值?例如。 $codes["CDN"] * 2 = 4690
      【解决方案3】:

      比这些答案中的任何一个都可以做到这一点的最佳方法。您可以使用 file_get_contents 和 array_walk 函数来缩短事情的时间。

      $allCases = explode("\r\n", file_get_contents("myfile.txt")); 
      $myList = array();    
      array_walk($allCases, "step", $myList); 
      
      function step($val, $key, &$arr) {
          $aCase = explode(" ", $val);
          $arr[$aCase[0]] = $aCase[1]; 
      }
      

      这样您就不需要 for 循环或文件处理程序。

      注意分隔符“\r\n”,因为在这种情况下这可能取决于平台。

      【讨论】:

        猜你喜欢
        • 2011-07-14
        • 2023-01-23
        • 2019-08-23
        • 2017-06-14
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 2019-06-26
        • 2012-03-01
        相关资源
        最近更新 更多