来自动态字符串的数组查​​找值

时间:2012-10-11 17:16:08

标签: php arrays dynamic

我正在尝试构建一个动态关联数组值查找函数(在一个类中):

class Family
{
    public static $members = array(
        'one' => array(
            'child' => 0,
            'children' => 5
            ),
        'two' => array(
            'child' => 2,
            'children' => null
            )
    );

    public static function resolveMemberValue()
    {
        $chain = func_get_args();
        $lookup = 'members' . '[\'' . implode('\'][\'', $chain) . '\']';

        var_dump( $lookup );

        return static::$$lookup;
    }
}

Family::resolveMemberValue('one', 'child');

但结果是:

  

string(23)“members ['one'] ['child']”
  致命错误:访问未申报的静态属性:第23行/family.php中的Family :: $ members ['one'] ['child']
  PHP致命错误:访问未声明的静态属性:第23行/family.php中的Family :: $ members ['one'] ['child']

虽然,复制转储的值,并粘贴在脚本+附加的美元符号内,它会返回预期的内容:

var_dump( Family::$members['one']['child'] );
  

INT(0)

我需要它的原因是,因为它将与多个变量一起使用,并从生成器函数调用。

该代码段有什么问题?

2 个答案:

答案 0 :(得分:0)

变量变量仅在字符串中替换变量名称。它无法评估该字符串的内容(在本例中为字符串members['one']['child']

您的代码正在寻找一个静态属性,其名称为$members['one']['child'],而不是静态数组$members的元素。

请改为尝试:

$member = static::$members[$chain[0]];
return $member[$chain[1]];

另外,我建议不要使用func_get_args(),而是在方法声明中明确命名参数。 PHP的一些功能最好留下......

答案 1 :(得分:0)

哦,不得不稍微修补一下 - 设法做一个辅助功能。

该函数替换implode()和显式键定义。

function array_lookup()
{
    $chain = func_get_args();
    $array = array_shift($chain);

    foreach ($chain as $key) $array = $array[$key];

    return $array;
}

$test = array(
    'one' => array(
        'child' => 0,
        'children' => 5
        ),
    'two' => array(
        'child' => 2,
        'children' => null
        )
    );

var_dump($test, 'one', 'child'); // int(0)

我已经遗漏了这个例子的任何错误检查,但它确实做了我想要的。

是的,就我的例子而言,it nails it