遍历文本文件中的行,搜索定界符并添加到关联数组

Loop through lines in text file, search for delimiter and add to associative array

我有一些这样的文字:

     $string = “———version1———
                item1-result1
                item2-result2
                item3-result3
                ———version2———
                Item1-result4
                Item2-result5
                Item3-result6
                ———version3———
                Item1-result7
                Item2-result8
                Item3-result9”

我需要遍历这些行并展开包含连字符定界符 (-) 的行,然后添加到关联数组但按版本分组,这样值就会像这样相互映射:

我需要的结果是这样的:

   array = [
    Version1_item1 => result1,
    Version1_item2=>result2
    …
    …
    Version2_item1=>result4
    etc
    ]

我可以使用 explode,将项目值添加到一个数组,将结果添加到另一个数组,然后使用 array_combine,但我似乎无法获得正确的代码。

 $final_result = array();
foreach (explode('\n', $string) as $piece) {
    $result = array();
    $result[] = explode('-', $piece);

有人能帮忙吗?

主要问题是您使用的是 '\n',但是在单引号中,它不代表换行符。你应该使用 "\n", 成双引号。

您应该使用 trim() 删除每行文本前后的多余空格。

最后,您将 $result 附加到爆炸数组,而不是分配给它:

$string = "This is the text file
        item1-result1
        item2-result2
        item3-result3
        End of text file";

$final_result = array();
foreach (explode("\n", $string) as $piece) {
    $piece = trim($piece);
    $result = explode('-', $piece);
    if (count($result) == 2) {
        $final_result[ $result[0] ] = $result[1];
    }
}
print_r($final_result);

输出:

Array
(
    [item1] => result1
    [item2] => result2
    [item3] => result3
)

编辑

$string = "———version1———
           item1-result1
           item2-result2
           item3-result3
           ———version2———
           Item1-result4
           Item2-result5
           Item3-result6
           ———version3———
           Item1-result7
           Item2-result8
           Item3-result9";

$final_result = array();
$current_version = '';
foreach (explode("\n", $string) as $piece) {
    $piece = trim($piece);
    if (strpos($piece, '———') === 0) $current_version = trim($piece,'—');
    $result = explode('-', $piece);
    if (count($result) == 2) {
        $final_result[ $current_version . '_' . $result[0] ] = $result[1];
    }
}
print_r($final_result);

输出:

Array
(
    [version1_item1] => result1
    [version1_item2] => result2
    [version1_item3] => result3
    [version2_Item1] => result4
    [version2_Item2] => result5
    [version2_Item3] => result6
    [version3_Item1] => result7
    [version3_Item2] => result8
    [version3_Item3] => result9
)

你的做法是对的,所以只是修改了单引号中的换行符。还请记住换行的最佳做法是使用 PHP 常量 PHP_EOL 表示当前系统的 EOL(行尾)。

foreach (explode(PHP_EOL, $string) as $piece) {

}