循环遍历文本文件中的行,搜索分隔符并添加到关联数组

时间:2018-04-04 18:10:59

标签: php arrays loops associative-array explode

我有一些文字:

     $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);

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

主要问题是您使用的是'\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
)

答案 1 :(得分:0)

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

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

}