Получить значение переменной по имени, если это элемент массива, возможно из superglobal - PullRequest
0 голосов
/ 30 ноября 2018

Можно ли вообще получить значение из переменной, к которой обращаются по имени, в случае, если она ссылается на элемент индексированного массива?На самом деле я планировал проделать этот трюк с $ _SERVER ['HTTP_HOST'], но я обнаружил, что $$ не подходит ни к какому конкретному элементу массива.

$a = '555';
$b = 'a';
var_dump($$b);

$a = array (1,2,3);
$b = 'a';
var_dump($$b);
$b = 'a[1]';
var_dump($$b);

Первые два vardumps работают как положено, нопоследний дает Примечание: неопределенная переменная: a [1] , хотя она, очевидно, существует.И я хочу, чтобы он вернул 2.

upd: PHP 7.1.16

1 Ответ

0 голосов
/ 30 ноября 2018

Вот простой анализатор для просто массивов строк или чисел

function parse($str) {
    // regex explanation:
    // ^ - beging of the string
    // valid name inside capture group with at least one character
    // \[ literal open bracket
    // ([^\]]+) - capture group with non closing bracket
    // \] - closing bracket
    // $ - end of string
    $re = "/^([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\[([^\]]+)\]$/";
    if (preg_match($re, $str, $match)) {
        $var = $match[1];
        global $$var;
        // regex for any integer
        if (preg_match("/^[0-9]+$/", $match[2])) {
            // convert integera like string to integer
            return $$var[intval($match[2])];
        } else {
            // remove quotes from beginning and ending of a string
            return $$var[trim($match[2], "\"'")];
        }
    } else {
        return $$str;
    }
}

$a = array (1,2,3);
$b = 'a';
var_dump($$b);
$b = 'a[1]';
var_dump(parse($b));

$a = array("foo" => "hello");
$b = 'a["foo"]';
var_dump(parse($b));
echo parse("_SERVER['HTTP_HOST']");

регулярное выражение для имени переменной можно найти в php docs

единственное ограничение заключается в том, чтопеременная должна быть глобальной, но _SERVER всегда глобальной, поэтому это не должно иметь значения.

...