2011-11-26 10 views
5

Esta es probablemente una simple pregunta, y me temo que la respuesta podría ser "no", pero ...¿Es posible hacer referencia a un elemento específico de una matriz anónima en PHP?

Aquí es un simple trozo de código:

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

Ahora ... ¿Puede este hacerse sin la variable temporal? En otro idioma, puede ser que esperaba ser capaz de decir:

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

Por desgracia, en PHP, esto resulta en un error:

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

Si no se puede hacer, no se puede hacerse, y usaré una variable temporal, pero preferiría no hacerlo.

Respuesta

1

La desreferenciación de matrices no está disponible en PHP 5.3 en este momento, pero estará disponible en PHP 5.4 (PHP 5.4.0 RC2 is currently available for you to tinker with). Mientras tanto, puede usar end(), reset(), o una función auxiliar para obtener lo que desea.

$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; 
    } 
} 

Tenga en cuenta que end() y current() se restablecerá el puntero interno de la matriz, así que tenga cuidado.

Para su comodidad, si va a estar encadenando sus desreferencias esto podría ser útil:

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'] 
Cuestiones relacionadas