在PHP中获取变量的一致表示/ ID的任何方法

时间:2015-01-24 01:00:21

标签: php

我试图找到一种方法来获取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*
                )

        )

)

0 个答案:

没有答案