php递归函数,用于将嵌套的{}分隔字符串转换为数组

php递归函数,用于将嵌套的{}分隔字符串转换为数组,php,arrays,multidimensional-array,nested,Php,Arrays,Multidimensional Array,Nested,我试图在php中构建一个递归函数,该函数接受带有嵌套{}值的字符串,并将其转换为嵌套数组。是否有任何内置函数可以简单地拆分此功能 而且{括号将始终与键在同一行,即(Main{)而不是Main{ 缩进也将始终保持一致 下面是我要找的例子 Main{ NetworkAccess 1; MaxCPE 6; MaxClassifiers 20; GlobalPrivacyEnable 1; BaselinePrivacy{ AuthTime

我试图在php中构建一个递归函数,该函数接受带有嵌套{}值的字符串,并将其转换为嵌套数组。是否有任何内置函数可以简单地拆分此功能

而且{括号将始终与键在同一行,即(Main{)而不是Main{

缩进也将始终保持一致

下面是我要找的例子

  Main{
    NetworkAccess 1; 
    MaxCPE 6; 
    MaxClassifiers 20; 
    GlobalPrivacyEnable 1; 
    BaselinePrivacy{
      AuthTimeout 10; 
      ReAuthTimeout 10; 
      AuthGraceTime 600; 
      OperTimeout 10; 
      ReKeyTimeout 10; 
      TEKGraceTime 600; 
      AuthRejectTimeout 60; 
      SAMapWaitTimeout 1; 
      SAMapMaxRetries 4; 
    }
    UsServiceFlow{
      UsServiceFlowRef 1; 
      QosParamSetType 7; 
      TrafficPriority 2; 
      MaxRateSustained 1000000; 
      SchedulingType 2; 
      MaxTrafficBurst 8000; 
      MaxConcatenatedBurst 8000; 
    }
    DsServiceFlow{
      DsServiceFlowRef 101; 
      QosParamSetType 7; 
      TrafficPriority 2; 
      MaxRateSustained 10000000; 
    }
  }

Array
(
    [Main] => Array
        (
            [NetworkAccess] => 1
            [MaxCPE] => 6
            [MaxClassifiers] => 20
            [GlobalPrivacyEnable] => 1
            [BaselinePrivacy] => Array
                (
                    [AuthTimeout] => 10
                    [ReAuthTimeout] => 10
                    [AuthGraceTime] => 600
                    [OperTimeout] => 10
                    [ReKeyTimeout] => 10
                    [TEKGraceTime] => 600
                    [AuthRejectTimeout] => 60
                    [SAMapWaitTimeout] => 1
                    [SAMapMaxRetries] => 4
                )

            [UsServiceFlow] => Array
                (
                    [UsServiceFlowRef] => 1
                    [QosParamSetType] => 7
                    [TrafficPriority] => 2
                    [MaxRateSustained] => 1000000
                    [SchedulingType] => 2
                    [MaxTrafficBurst] => 8000
                    [MaxConcatenatedBurst] => 8000
                )

            [DsServiceFlow] => Array
                (
                    [DsServiceFlowRef] => 101
                    [QosParamSetType] => 7
                    [TrafficPriority] => 2
                    [MaxRateSustained] => 10000000
                )

        )

)

JSON会更好,但会更困难,因为它不喜欢在不需要逗号的地方使用逗号(PHP不介意)


对于当前数据和一致的花括号,另一个选项可能是使用递归函数,利用跟踪当前数据和父数据的引用

在换行符上分解并将该数组作为起始点传递。对于每次迭代,从顶部取下第一个,如果数组为空,则使用它将返回null

如果最后一个字符是
{
,则当前字符将是父字符,并将新数组设置为下一次迭代的当前字符

当唯一的字符是
}
时,在下一次迭代中使用父级

例如:

function processItems($items, &$current, &$parent) {
    $item =  trim(array_shift($items));
    if ($item) {

        if (substr($item, -1) === '{') {
            $key = rtrim($item, '{');
            $current[$key] = [];
            processItems($items, $current[$key], $parent);
            return;
        }

        if (trim($item) === '}') {
            processItems($items, $parent, $parent);
            return;
        }

        $parts = explode(' ',  $item);
        $current[$parts[0]] = rtrim($parts[1], ';');

        processItems($items, $current, $parent);
    }
}

$curr = [];
processItems(explode("\n", $data), $curr, $curr);

print_r($curr);
结果

Array
(
    [Main] => Array
        (
            [NetworkAccess] => 1
            [MaxCPE] => 6
            [MaxClassifiers] => 20
            [GlobalPrivacyEnable] => 1
            [BaselinePrivacy] => Array
                (
                    [AuthTimeout] => 10
                    [ReAuthTimeout] => 10
                    [AuthGraceTime] => 600
                    [OperTimeout] => 10
                    [ReKeyTimeout] => 10
                    [TEKGraceTime] => 600
                    [AuthRejectTimeout] => 60
                    [SAMapWaitTimeout] => 1
                    [SAMapMaxRetries] => 4
                )

        )

    [UsServiceFlow] => Array
        (
            [UsServiceFlowRef] => 1
            [QosParamSetType] => 7
            [TrafficPriority] => 2
            [MaxRateSustained] => 1000000
            [SchedulingType] => 2
            [MaxTrafficBurst] => 8000
            [MaxConcatenatedBurst] => 8000
        )

    [DsServiceFlow] => Array
        (
            [DsServiceFlowRef] => 101
            [QosParamSetType] => 7
            [TrafficPriority] => 2
            [MaxRateSustained] => 10000000
        )

)

@Skyler如果您正在转换的数据是可信的,那没关系。您应该在这里查看
eval
Array
(
    [Main] => Array
        (
            [NetworkAccess] => 1
            [MaxCPE] => 6
            [MaxClassifiers] => 20
            [GlobalPrivacyEnable] => 1
            [BaselinePrivacy] => Array
                (
                    [AuthTimeout] => 10
                    [ReAuthTimeout] => 10
                    [AuthGraceTime] => 600
                    [OperTimeout] => 10
                    [ReKeyTimeout] => 10
                    [TEKGraceTime] => 600
                    [AuthRejectTimeout] => 60
                    [SAMapWaitTimeout] => 1
                    [SAMapMaxRetries] => 4
                )

        )

    [UsServiceFlow] => Array
        (
            [UsServiceFlowRef] => 1
            [QosParamSetType] => 7
            [TrafficPriority] => 2
            [MaxRateSustained] => 1000000
            [SchedulingType] => 2
            [MaxTrafficBurst] => 8000
            [MaxConcatenatedBurst] => 8000
        )

    [DsServiceFlow] => Array
        (
            [DsServiceFlowRef] => 101
            [QosParamSetType] => 7
            [TrafficPriority] => 2
            [MaxRateSustained] => 10000000
        )

)