我试图找到一种方法来获取PHP中变量的字符串表示,以检查我之前是否遇到过该变量。我实现了一个递归处理数组的函数,防止无限递归会很有用。
现在我存储对我在单独数组中处理的每个变量的引用,然后将其与当前变量进行比较(使用===
查看它们是否是同一个实例) ,但这需要O(n)
查找。如果我可以获得一致的字符串表示,我可以将其更改为O(1)
操作。
我希望我能得到内部变量ID或类似内容。
这是我现在正在做的一个例子(超级基本):
$a = ['a' => 'value a', 'b' => 'value b'];
$b = ['test' => &$a];
$c = ['a' => &$a, 'b' => &$b];
$a['c'] = &$c;
$b['c'] = &$c;
function process_array($array, &$tracker, $depth = 0)
{
foreach ($array as $key => $value) {
if (is_array($value)) {
// Check for recursion
foreach ($tracker as $prev) {
if ($prev === $value) {
echo str_repeat(' ', $depth * 2) . "*RECURSION*\n";
return;
}
}
// Keep track of variables we have already processed to detect recursion
$tracker[] = &$value;
echo str_repeat(' ', $depth * 2) . "Key: {$key}\n";
process_array($value, $tracker, $depth + 1);
} else {
echo str_repeat(' ', $depth * 2) . "Key: {$key}\n";
echo str_repeat(' ', $depth * 2) . "Value: {$value}\n";
}
}
}
$tracker = array();
process_array($c, $tracker);
输出:
Key: a
Key: a
Value: value a
Key: b
Value: value b
Key: c
*RECURSION*
*RECURSION*
另一个例子,我试图实现与print_r
类似的东西:
Array
(
[a] => Array
(
[a] => value a
[b] => value b
[c] => Array
(
[a] => Array
*RECURSION*
[b] => Array
(
[test] => Array
*RECURSION*
[c] => Array
*RECURSION*
)
)
)
[b] => Array
(
[test] => Array
(
[a] => value a
[b] => value b
[c] => Array
(
[a] => Array
*RECURSION*
[b] => Array
*RECURSION*
)
)
[c] => Array
(
[a] => Array
(
[a] => value a
[b] => value b
[c] => Array
*RECURSION*
)
[b] => Array
*RECURSION*
)
)
)