переменные php 4 - PullRequest
       3

переменные php 4

0 голосов
/ 17 августа 2010

$ str = 'input_arr ["username"]';

$ input_arr = array ();

$$ str = 'abcd';

print_r ($ input_arr);

Когда я запускаю приведенный выше код, он печатает только Array ().

Я ожидал, что он напечатает Array ([username] => abcd ')

Что я делаю не так?

Кстати, это в php 4.

Большое спасибо.

Редактировать: Что я пытаюсь сделать?

Предполагается, что $ input_arr является статической переменной для хранения проверенного пользовательского ввода. Однако я только недавно понял, что php4.3 не поддерживает self :: $ input_arr, поэтому мне пришлось отредактировать мой скрипт на bar ($ input_arr ['name«], $ значение);так что я могу сохранить значение в статической переменной в bar (), поскольку $ input_arr ['name'] не существует в текущей области видимости, мне пришлось сделать это строкой.

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Я бы старался избегать eval любой ценой.Используйте встроенный токенизатор PHP.

<?php
error_reporting(-1);
$input = array(3 => array(5 => 'some value'));

echo '$input: '; var_dump($input);

echo '$input[3][5] (directly): '; var_dump($input[3][5]);

$str = '$input[3][5]';
echo "$str (as a variable variable): "; var_dump($$str);

echo "$str (using eval - don't use this!): "; var_dump(eval("return $str;"));

$var = null;
foreach (token_get_all("<?php $str") as $token) {
    if (isset($token[1]) && $token[1] === '<?php') {
        continue;
    }
    if (isset($token[0]) && $token[0] === T_VARIABLE) {
        $varName = substr($token[1], 1);
        $var = $$varName;
    } else if ($token === '[') {
        $currentIndex = null;
    } else if (isset($token[0]) && $token[0] === T_LNUMBER) {
        $currentIndex = $token[1];
    } else if ($token === ']') {
        $var = $var[$currentIndex];
    } else {
        // Handle/complain about unrecognized input.
    }
}
echo "$str (using tokenizer): "; var_dump($var);

Вывод:

$input: array(1) {
  [3]=>
  array(1) {
    [5]=>
    string(10) "some value"
  }
}
$input[3][5] (directly): string(10) "some value"
$input[3][5] (as a variable variable): 
Notice: Undefined variable: $input[3][5] in - on line 10
NULL
$input[3][5] (using eval - don't use this!): string(10) "some value"
$input[3][5] (using tokenizer): string(10) "some value"
0 голосов
/ 17 августа 2010

Может работать с 2 переменными, если вы действительно этого хотите. Еще лучше, если вы используете ссылку на массив вместо переменной.

$input_arr = Array();

function somefunction($array, $key)
{
    ${$array}[$key] = 'abcd';
}

function betterfunction(&$array, $key)
{
    $array[$key] = 'abcd';
}

somefunction('input_arr', 'username');
betterfunction($input_arr, 'username');
0 голосов
/ 17 августа 2010

Все еще трудно сказать, что вы пытаетесь сделать, но, похоже, вы хотите, чтобы $str определил, где внутри $input_arr часть данных живет. Если это так, вы должны хранить только ключи массива в $str, а не строковое представление кода.

В последнем примере это так же просто, как установить $str = 'name' и затем использовать $input_arr[$str] для доступа к $input['name']. В первом случае вы можете использовать массив $keys = array(3,5) вместо $str, и тогда $input_arr[$keys[0]][$keys[1]] будет эквивалентно $input_arr[3][5].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...