Php 如何将字符串从文件指针转换到表或数组中

Php 如何将字符串从文件指针转换到表或数组中,php,asterisk,Php,Asterisk,我在转换字符串响应fgets()时遇到问题 答案是这样的 Channel Context Extension Prio State Application Data CallerID Duration Accountcode PeerAccount BridgedTo Agent/2704 outgoing

我在转换字符串响应fgets()时遇到问题

答案是这样的

Channel              Context              Extension        Prio State   Application  Data                      CallerID        Duration Accountcode PeerAccount BridgedTo           
Agent/2704           outgoing             901261499329974     1 Up      AppQueue     (Outgoing Line)           901261499329974 00:02:28                         SIP/pbx-load-balance
SIP/135-00005571     outgoing             90116567011298     17 Up      Dial         SIP/pbx-load-balancer/901 61290371819     00:17:40                         SIP/pbx-load-balance
SIP/140-00005744     outgoing             90116562654777     17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:00:03                         (None)              
SIP/144-00005741     outgoing             90116563334544     17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:00:17                         SIP/pbx-load-balance
SIP/pbx-load-balance outgoing                                 1 Up      AppDial      (Outgoing Line)           90116567011298  00:17:40                         SIP/135-00005571    
SIP/200-00005730     outgoing             901161384201116    17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:01:28                         SIP/pbx-load-balance
如何将其格式化为表格式或至少是数组格式


这里有人吗?。。非常感谢你!!非常感谢

它类似于csv文件,但似乎出现了多个空白。标题行似乎有没有空白的字段名。让我们找到场的位置,计算场的长度。然后创建一个正则表达式,它只根据字段的长度获取字段。最后,我们修剪字段,删除不需要的空白

$csv = <<< '_END_'
Channel              Context              Extension        Prio State   Application  Data                      CallerID        Duration Accountcode PeerAccount BridgedTo           
Agent/2704           outgoing             901261499329974     1 Up      AppQueue     (Outgoing Line)           901261499329974 00:02:28                         SIP/pbx-load-balance
SIP/135-00005571     outgoing             90116567011298     17 Up      Dial         SIP/pbx-load-balancer/901 61290371819     00:17:40                         SIP/pbx-load-balance
SIP/140-00005744     outgoing             90116562654777     17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:00:03                         (None)              
SIP/144-00005741     outgoing             90116563334544     17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:00:17                         SIP/pbx-load-balance
SIP/pbx-load-balance outgoing                                 1 Up      AppDial      (Outgoing Line)           90116567011298  00:17:40                         SIP/135-00005571    
SIP/200-00005730     outgoing             901161384201116    17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:01:28                         SIP/pbx-load-balance
_END_;

$lines = preg_split('~\r?\n~', $csv);


// word begin/end with no space behind (=word begin only)
preg_match_all('~\b(?>[^\s])~', $lines[0], $pos_fields, PREG_OFFSET_CAPTURE);
$pos_fields=$pos_fields[0];

$regexp = '';
$pos = $pos_fields[0][1];

// (.{10}) for a field width 10
for($i = 1; $i < count($pos_fields); $i++)
  $regexp .= '(.{' . ($pos_fields[$i][1] - $pos_fields[$i - 1][1]) . '})';

$regexp = "/$regexp(.*)/";
$arr = [];

for($i = 0; $i < count($lines); $i++)
{
  preg_match($regexp, $lines[$i], $line);
  array_shift($line);
  array_walk($line, function(&$val, $k)  { $val= $arr[$k] = chop($val); });
  $arr[] = $line;
}

var_dump($arr);

$csv=您必须省略第一行,然后在空格/制表符上使用preg_split:,尽管有些标题有空值,所以你在这里不会有太多的乐趣,这实际上是我的问题…一列中的那些空值阻止我进行preg_分割或preg_替换…我很好奇有人会想出什么办法来解决这个问题,我脑子里的任何东西都会被击中和错过,对不起,我不能提供进一步的帮助,这很好:-)。。但无论如何,谢谢这一切都很好。。。但是最后一列(BridgedTo列)没有包含在数组中…Ups,我忘了将刚刚通过编辑完成的regexp的
*
括在括号中:)()
捕获子模式。