解析一个文本文件并得到一个数组类型的数组("(0:00)" =>" text1","(0:30)" =>" text2")

时间:2016-08-13 11:35:27

标签: php

我有一个文本文件

(0:00)

text1

text2

(0:30)

text text text text text

..................

结果应该是这样的

array("(0:00)"=>"text1 text2","(0:30)"=>"text text text text text") 

我的代码

$key = array();
    $val = array();
    $out = array();
    $file = file('1.txt');
    foreach($file as $line) {
        $line = trim($line);
        if (preg_match("/(\d{0,2}:\d\d)/",$line,$match)){
            $key[]=$match;
        }else{
            $val[]=$match;
        }
        $out=array_merge($key,$val);
    }
    echo '<pre>';
    print_r($out);

告诉我,如何解决?

2 个答案:

答案 0 :(得分:1)

试试这个:

$n = preg_match_all('/\((\d{0,2}:\d\d)\)([\s+]*?)([^\(]*)/mi', $file, $matches);

$out = array();
for ($i = 0; $i < count($matches[1]); ++$i)
{
                            // for removing newline characters:
    $out[$matches[1][$i]] = trim(preg_replace('/\s\s+/', ' ', $matches[3][$i])); 
}

var_dump($out);

起初我按照你的方式尝试了它,但是使用一个正则表达式似乎要容易得多。

它给了我以下结果:

array(2) {
  ["0:00"]=>
  string(11) "text1 text2"
  ["0:30"]=>
  string(24) "text text text text text"
}

答案 1 :(得分:0)

您可以循环查找第一个键的数组,然后将所有出现的内容添加到此键,直到您找到下一个键。

此外,您的代码有几个逻辑错误:

$key[]=$match; - $ match是一个数组,你应该使用第一次出现

$val[]=$match; - $match在这种情况下为空(找不到匹配项),您应该使用$line

更正后的代码:

$out = array();
$key = "";
$file = file('aaa.txt');
foreach($file as $line) {
    $line = trim($line);
    if(empty($line)) continue;
    if (preg_match("/(\d{0,2}:\d\d)/",$line,$match)){
        $key = $match[0];
        continue;
    }
    if(!empty($key)){
        $out[$key] = $line;
    }
}
echo '<pre>';
print_r($out);