我有一个文本文件
(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);
告诉我,如何解决?
答案 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);