访问PHP数组 - 由$ _GET定义的名称

时间:2013-05-06 14:37:43

标签: php arrays

我目前无法访问数组,其中数组的名称由$ _GET定义。

如果我有以下数组:

$test = array('Hello', 'Apples', 'Green');
$AnotherArray = array('Blue', 'Sun');

然后我想显示数组$ test,当我打开我的脚本时这样:

ajax.php?arrayName=test

感谢您的帮助。

8 个答案:

答案 0 :(得分:6)

可以使用variable variables完成此操作:

$the_array = ${$_GET['arrayName']};

重要

这就像使用炸药一样,因为恶意用户可以轻松地将变量名称与其他东西交换并破坏您的应用程序。

最佳做法是首先将变量名称列入白名单:

$safe_vars = array('test', 'AnotherArray');
if (in_array($_GET['arrayName'], $safe_vars, true)) {
    $the_array = ${$_GET['arrayName']};
}

<强>替代

mentioned作为Pekka 웃,您还可以考虑在一个母阵列中包含可访问的数组:

$arrays = array(
    'test' => array('Hello', 'Apples', 'Green'),
    'AnotherArray' = array('Blue', 'Sun')
);

if (isset($arrays[$_GET['arrayName']])) {
    $the_array = $arrays[$_GET['arrayName']];
}

这里的好处是没有使用魔法,只需要简单的数组解除引用。

答案 1 :(得分:5)

请不要为这个简单的任务使用变量变量:

通常,只使用“arrayName”或类似参数作为建议,不要直接使用用户输入,以保证安全。

在这种情况下,我实际上只是建议使用整数:

url?showdata=1 //Shows the $test array

url?showdata=2 // Shows the $AnotherArray

url?showdata=3 // Shows another array of your choice

或者如果你必须使事情复杂化,只需检查?arrayName =是否完全等于'test'或完全等于'AnotherArray',然后使用指定的数组。

同样,变量变量是一种复杂性和麻烦,你可能会对这种简单的情况感到后悔!

答案 2 :(得分:3)

试试这个

$test = array('Hello', 'Apples', 'Green');
$AnotherArray = array('Blue', 'Sun');

if( $_GET['arrayName'] == 'test')
{
   print_r($test);
}
else if( $_GET['arrayName'] == 'AnotherArray')
{
   print_r($AnotherArray);
}

答案 3 :(得分:3)

您可以使用变量变量,但将此限制仅限于“安全”变量名称非常重要。

在这个例子中,我展示了使用变量变量的两种方法。

<?

$_GET['arrayName'] = 'test';

$test = array('Hello', 'Apples', 'Green');
$AnotherArray = array('Blue', 'Sun');

// safety check. only allow defined arrays from this list. Check with array of allowed names.
$possibleArrays = array('test', 'AnotherArray');

if(array_search($_GET['arrayName'], $possibleArrays) !== false)
{
    var_dump($$_GET['arrayName']);
}
else
{
    echo "warning, accessing undefined array";
}

// safety check, only allow my defined arrays. Check with switch statement.
switch($_GET['arrayName'])
{
    case 'test':
    case 'AnotherArray':
        var_dump($$_GET['arrayName']);
        break;
    default:
        echo "warning, accessing undefined array";
}

答案 4 :(得分:1)

使用variable variable names

$allowedArrayNames = array( 'test', 'AnotherArray' );

if( in_array( $_GET['arrayName'], $allowedArrayNames ) && isset( $$_GET['arrayName'] ) )
{
    print_r( $$_GET['arrayName'] );
}

答案 5 :(得分:1)

为什么不提取?这样,您不允许访问其他变量,只有在知道变量时才执行代码?

extract($_GET);
print_r($$arrayName);

甚至可以添加前缀以帮助保持清洁。

extract($_GET,EXTR_PREFIX_ALL,"get_");
print_r($$get_arrayName);

答案 6 :(得分:-1)

您是否尝试过以下操作:

$$_GET["arrayName"]

答案 7 :(得分:-1)

您可以使用变量变量,如下所示:

$arrayNameGiven = $_GET['arrayName'];    // e.g. "test"
echo $$arrayNameGiven[1];    // "Apples"

在此处阅读更多内容:http://www.php.net/manual/en/language.variables.variable.php