PHP:在多维数组中解析数据

时间:2014-04-27 05:49:50

标签: php parsing multidimensional-array

我有一个看起来像这样的数组:

    Array
(
    [0] => Array
        (
            [0] => TE=140414100000  cd  =AB1234  ggg   =1234567  gbh  =2
            [7] => nd: DA1AAAAAAAAAA: TD = 140414: 
        )

    [1] => Array
        (
            [0] => TE=140414100000  cd  =AB1234  ggg   =1234567  ghb  =2
            [7] => nd: DA1AAAAAAAAAA: TD = 140414:
        )
)

我想要实现的是解析每个子数组中的数据并使用解析的数据创建一个新的多维数组。

示例:下面括号中的数据是应该在新的多维数组中返回的内容

    Array
(
    [0] => Array
        (
            [0] => te=(140414100000)  cd  =AB(1234)  ggg   =1234567  ghb  =2
            [7] => nd: DA(1)(AAAAAAAAAA): TD = (140414): 
        )

    [1] => Array
        (
            [0] => te=(140414100000)  cd  =AB(1234)  ggg   =1234567  ghb  =2
            [7] => nd: DA(2)(BBBBBBBBBB): TD = (140414):
        )
)

我想要回归:

    Array
(
    [0] => Array
        (
            [0] => 140414100000
            [1] => 1234
            [2] => 1
            [3] => AAAAAAAAAA
            [4] => 140414
        )

    [1] => Array
        (
            [0] => 140414100000
            [1] => 1234
            [2] => 2
            [3] => BBBBBBBBBB
            [4] => 140414
        )
).

所以我的问题是实现这个目标的最佳方法是什么?

这就是我想出的。它工作,但似乎非常低效,因为它添加了许多必须清理的空数组。

foreach($new as $key => $val){
            foreach($val as $res){
                preg_match_all('%te=([0-9]{12})\s%',$res,$matches);
                $out[$key][] = $matches[1][0];
                preg_match_all('%cd\s+=AB([0-9]{4})%',$res,$matches);
                $out[$key][] = $matches[1][0];
                preg_match_all('%nd:\sDA([0-9]{1})%',$res,$matches);
                $out[$key]['node'] = $matches[1][0];
                preg_match_all('%nd:\sDA[0-9]{1}([a-zA-Z]{10,14}):%',$res,$matches);
                $out[$key]['rset'] = $matches[1][0];
                preg_match_all('%td\s=\s([0-9]{6}):%',$res,$matches);
                $out[$key]['trdt'] = $matches[1][0];
            }
        }
        foreach($out as $v){
            $v = array_values(array_filter($v));
            $return[] = $v; 
        }
        return $return;

提前致谢。

更新: 这样做效率更高。感谢Shankar的例子

foreach($new as $key => $val){
            $v = implode('', $val);
            preg_match_all("%te=([0-9]{12})|cd\s+=AB([0-9]{4})|nd:\sDA([0-9]{1})|([A-Z]{3,7}):|td=\s([0-9]{6}):%",$v,$matches);
            $new_array[$key]['time'] = $matches[1][0];
            $new_array[$key]['code'] = $matches[2][1];
            $new_array[$key]['sp'] = $matches[3][2];
            $new_array[$key]['rset'] = $matches[4][3];
            $new_array[$key]['trfdt'] = $matches[5][4];
        }
        echo "<pre>";
        print_r($new_array);
        echo "</pre>";

1 个答案:

答案 0 :(得分:0)

循环遍历数组并implode每个数组元素并使用preg_match_all()捕获()之后的所有条目,然后将这些匹配项传递给新数组

foreach($arr as $k=>$arr1)
{
    $v = implode('',$arr1);
    preg_match_all('^\((.*?)\)^', $v, $matches);
    $new_arr[]=$matches[1];
}
print_r($new_arr);

Working Demo