【问题标题】:Loop through lines in text file, search for delimiter and add to associative array遍历文本文件中的行,搜索分隔符并添加到关联数组
【发布时间】:2018-09-14 09:52:19
【问题描述】:

我有一些这样的文字:

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

有人可以帮忙吗?

【问题讨论】:

    标签: php arrays loops associative-array explode


    【解决方案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
    )
    

    【讨论】:

    • 谢谢!我不得不改变我的字符串的限制和我想要的输出,我更新了我的问题,你知道我怎么能做到这一点吗?
    • @user 我已经更新了答案,请参阅“编辑”部分。请注意,字符 不是 -。并且在$stringstrpos()trim() 中应该是相同的。
    【解决方案2】:

    您的方法是正确的,因此只需修改单引号中的换行符。还要记住换行的最佳做法是使用代表当前系统的 EOL(行尾)的 PHP 常量 PHP_EOL。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多