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

时间:2022-12-20 21:34:52

I have an array which looks like this:

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

    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:
        )
)

what I am trying to acomplish is to parse data within each sub array and create a new multidimensional array with the parsed data.

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

Example: the data in parentheses below is what should be returned in new multidimensional array

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

    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):
        )
)

What I want to return:

我要回报的内容:

    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
        )
).

So my question is what would be the best way to acomplish this?

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

This is what I have come up with. It works, however is seems very inefficient as it adds a lot of empty arrays which have to be cleaned up.

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

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;

Thanks in advance.

提前致谢。

UPDATED: This worked and is much more efficient. Thanks for the example Shankar

更新:这有效,效率更高。感谢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 个解决方案

#1


0  

Loop through your array and implode each array element and use a preg_match_all() to capture all the entries bewteen ( and ) and then pass those matches to your new array.

循环遍历数组并内爆每个数组元素并使用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

#1


0  

Loop through your array and implode each array element and use a preg_match_all() to capture all the entries bewteen ( and ) and then pass those matches to your new array.

循环遍历数组并内爆每个数组元素并使用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