gpt4 book ai didi

php - 调试递归 while 循环 (php)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:42 24 4
gpt4 key购买 nike

我正在编写一个函数来从 mustache 模板中获取标签并生成哈希(这样做的原因是能够获取任何给定的模板并快速向开发人员显示预期的变量是什么)。

我将标签提取到平面数组中(很简单),但下一步很棘手 - 我需要将平面数组转换为多维数组以指示嵌套变量。

这是我的示例平面阵列:

$arr = array(
'one',
'#two',
'sub1',
'sub2',
'/two',
'three'
);

以及预期的输出:

$newArray = array(
'one'=>'',
'two'=>array(
'sub1'=>'',
'sub2'=>''
),
'three'=>''
);

我已经接近了,但还没有完全达到。我认为递归函数是可行的方法(尽管我对不同的解决方案持开放态度)。这是我目前所拥有的:

function recurse($array, $i = 0) {
$nested = array();

while ($i < count($array)):
$tag = $array[$i];

if (preg_match('/\//',$tag)) {
return $nested;
} elseif (preg_match('/^#/',$tag)) {
$tag = str_replace('#','',$tag);
$nested[$tag] = recurse($array, $i+1);
$i+= count($nested[$tag])+1;
} else {
$nested[$tag] = '';
$i++;
}
endwhile;
return $nested;
}

我认为这个错误可能是它遇到第一个“if”并一直返回到函数之外,但我不确定,也不确定如何修复它。

最佳答案

只是为了好玩,我决定为您制作一个没有递归并使用引用代替(比递归更有效,将数组元素别名存储在堆栈上)。也适用于嵌套子集。

$arr = array(
'one',
'#two','sub1',
'#twotwo','sub1','sub2','/twotwo',
'sub2','/two',
'three'
);

$out = array();

$stack = array();
$sp = 0;

$stack[$sp] = &$out;

foreach ($arr as $item) {
$cur =& $stack[$sp];
if ($item[0] == '#') {
$item = substr($item, 1);
$cur[$item] = array();
$stack[++$sp] = &$cur[$item];
}
elseif ($item[0] == '/') {
$sp--;
}
else {
$cur[] = $item;
}
}
var_dump($out);

输出:

array
0 => string 'one' (length=3)
'two' => &
array
0 => string 'sub1' (length=4)
'twotwo' => &
array
0 => string 'sub1' (length=4)
1 => string 'sub2' (length=4)
1 => string 'sub2' (length=4)
1 => string 'three' (length=5)

您可以忽略在输出中看到 & array 而不是简单的 array 的事实。这表示在符号表中,该特定元素的引用计数大于 1。

原因是 $stack 仍然维护着一个引用。如果您在返回输出之前执行 unset($stack);,附加引用将被删除并且输出中的 & 将消失。

关于php - 调试递归 while 循环 (php),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9432439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com