将分隔字符串转换为关联数组

7

我有一个名为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)
3个回答

11
很简单。首先逐行读取文件(例如,参见已经执行此操作的 file 函数)。然后通过在第一个空格处分割每一行来解析它们(参见 explode),使用第一部分作为键,第二部分作为值:
$array = array();
foreach (file($myFile) as $line)
{
    list($key, $value) = explode(' ', $line, 2) + array(NULL, NULL);

    if ($value !== NULL)
    {
        $array[$key] = $value;
    }
}

如果您的解析器需要更具体的内容,请根据您的需求进行更改。有许多PHP字符串函数可用于更具区分性的解析,例如sscanf正则表达式
另一种常见的方法是从SplFileObject扩展,它允许将数据获取封装在迭代器中,因此您可以更好地区分数据使用的位置和获取数据的位置。您可以在另一个答案中找到示例:

非常好,但我需要FILE_IGNORE_NEW_LINES。可能是Windows的问题吗? - M T
@MT 不一定,我也在Linux上使用它与files一起使用,通常当我对行终止符本身不感兴趣,而只是每行字符串时。你可能想分享更多关于你试图实现什么的信息,这样我才能真正了解你所关心的问题。 - hakre
谢谢您的提问,但我不太确定问题是什么。我需要按照原始问题所要求的做。您的答案对我有用,但只有在我添加忽略新行选项时才有效。我认为这是因为Unix和Windows处理行尾的方式不同。DOS使用"\r\n",而Unix只使用"\n",如此处所讨论的:https://www.cs.toronto.edu/~krueger/csc209h/tut/line-endings.html#:~:text=Text%20files%20created%20on%20DOS,(%22%5Cn%22)。 - M T
@MT 是的,那肯定可以。那么就使用那个选项,没问题。对于答案,我们不关心换行符,我完全认为使用该选项没有问题,所以使用适合您的选项即可。该标志正是针对这种情况的。 - hakre
谢谢。我发表评论只是为了帮助其他Windows用户,如果他们遇到类似的问题。最终,由于我正在使用它来将“秘密”排除在我的git仓库之外,然后请求评审,我被建议最好的方法是将它们作为变量添加到单独的(.gitignored)php文件中,然后包括它。但是你的关联数组文件读取方法对我来说看起来非常干净,所以我可能会在其他方面使用它。 - M T

4
$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。 - karto

1

有一种比这些答案更优的方法。您可以使用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"可能因平台而异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接