Можно ли ссылаться на определенный элемент анонимного массива в PHP?

Вероятно, это простой вопрос, и я боюсь, что ответ может быть "нет", но...

Вот простой фрагмент кода:

function func1() {
  $bt = debug_backtrace();
  print "Previous function was " . $bt[1]['function'] . "\n";
}

Теперь... Можно ли это сделать без временной переменной? На другом языке я мог бы ожидать, что смогу сказать:

function func1() {
  print "Previous function was " . (debug_backtrace())[1]['function'] . "\n";
}

Увы, в PHP это приводит к ошибке:

PHP Parse error:  syntax error, unexpected '[' ...

Если это невозможно сделать, то это невозможно, и я буду использовать временную переменную, но я бы не хотел.


person Rick Koshi    schedule 26.11.2011    source источник


Ответы (2)


Нет, прямое разыменование, к сожалению, не поддерживается в текущих версиях PHP, но, по-видимому, появится в PHP 5.4.

Также см. терминологический вопрос о разыменовании?.

person deceze♦    schedule 26.11.2011

Разыменование массива сейчас недоступно в PHP 5.3, но будет доступно в PHP 5.4 (PHP 5.4.0 RC2 в настоящее время доступен для вас, чтобы возиться с). Тем временем вы можете использовать end(), reset() или вспомогательную функцию, чтобы получить то, что вы хотите.

$a = array('a','b','c');
echo reset($a);          // echoes 'a'
echo end($a);            // echoes 'c'
echo dereference($a, 1); // echoes 'b'

function dereference($arr, $key) {
    if(array_key_exists($key, $arr)) {
        return $array[$key];
    } else {
        trigger_error('Undefined index: '.$key); // This would be the standard
        return null;
    }
}

Обратите внимание, что end() и current() сбрасывают внутренний указатель массива, так что будьте осторожны.

Для вашего удобства, если вы будете связывать свои разыменования, это может пригодиться:

function chained_dereference($arr, $keys) {
    foreach($keys as $key) {
        $arr = dereference($arr, $key);
    }

    return $arr;
}

// chained_dereference(debug_backtrace(), array(1, 'function')) = debug_backtrace()[1]['function']
person Bailey Parker    schedule 26.11.2011