php递归函数,用于将嵌套的{}分隔字符串转换为数组
我试图在php中构建一个递归函数,该函数接受带有嵌套{}值的字符串,并将其转换为嵌套数组。是否有任何内置函数可以简单地拆分此功能 而且{括号将始终与键在同一行,即(Main{)而不是Main{ 缩进也将始终保持一致 下面是我要找的例子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
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
)
)