2008-12-28 11 views
15

Estoy trabajando en un programa que utiliza punteros de matriz internos de PHP para iterar a lo largo de una matriz multidimensional. Necesito obtener un elemento de la fila actual, y yo he estado haciendo de este modo:¿Tiene acceso al elemento de matriz de PHP con una función?

$arr[key($arr)]['item'] 

Sin embargo, me gusta mucho más que usar algo como:

current($arr)['item'] // invalid syntax 

estoy con la esperanza de que hay una función por ahí que me he perdido en mi exploración de la documentación que me permita acceder al elemento de este modo:

getvalue(current($arr), 'item') 

o

current($arr)->getvalue('item') 

¿Alguna sugerencia?

+2

Usted ya ha encontrado la mejor solución: $ arr [key ($ arr)] ['item'] –

+0

El método 'getvalue' sería útil incluso en matrices de dimmensión simple. Permitiría resolver las limitaciones de sintaxis de ≤5.3 y permitir el acceso a un elemento desde una matriz, digamos devuelto por una llamada de función, directamente dentro de una declaración. Me falta esa función interna. – Glutexo

Respuesta

12

dudo mucho hay una función de este tipo, pero es trivial para escribir

function getvalue($array, $key) 
{ 
    return $array[$key]; 
} 

Edición: A partir de PHP 5.4, puede elementos de índice de matriz directamente desde las expresiones de función, current($arr)['item'].

+3

Creo que esto es probablemente lo que terminaré haciendo. Si tiene razón en que no existe tal función, es un mal control. –

1

¿Has probado a usar uno de los iterator classes todavía? Puede haber algo allí que haga exactamente lo que quieres. De lo contrario, es probable que consigas lo que deseas al extender la clase ArrayObject.

+0

Acabo de mirar esos, parece que es solo una forma orientada a objetos para recorrer el conjunto.ArrayIterator :: current devuelve el elemento actual, de la misma manera que lo hace la función current(), que realmente no es el problema que estaba teniendo. –

-1

Si esto no funciona, ¿cómo se compone su matriz multidimensional? Un var_dump() podría ayudar.

$subkey = 'B'; 
$arr = array(
    $subkey => array(
     'AB' => 'A1', 
     'AC' => 'A2' 
    ) 
); 


echo current($arr[$subkey]); 
next($arr[$subkey]); 
echo current($arr[$subkey]); 
+0

La iteración que realizo es realmente solo a lo largo de la matriz primaria. Dije "multidimensional" porque los elementos correspondientes de la matriz principal son en sí mismos matrices, pero no quiero iterar sobre ellos. Solo quiero acceder a ellos convenientemente. –

+0

¿Qué le parece tratar $ arr [$ subkey] como una matriz, o $ new_arr = array_values ​​($ arr [$ subkey])? Nota al pie: ¿qué difiere entre su corriente solicitada ($ arr) ['item'] y actual ($ arr ['item'])? – chelmertz

-1

A menudo utilizo

foreach ($arr as $key=>$val) { 
    $val['item'] /*$val is the value of the array*/ 
    $key   /*$key is the key used */ 
} 

en lugar de

siguiente ($ matriz)/corriente ($ matriz)

+0

Yo también lo uso - por el bien de la pregunta, eliminé el hecho de que en realidad estoy bajando dos arreglos ordenados en busca de diferencias, y estoy bastante seguro de que foreach no admite ese tipo de acceso, pero podría ser incorrecto. De todos modos, gracias por tu respuesta. :) –

0

Esta función podría ser un poco lenghty pero yo lo uso todo el tiempo, especialmente en escenarios como:

if (array_key_exists('user', $_SESSION) === true) 
{ 
    if (array_key_exists('level', $_SESSION['user']) === true) 
    { 
     $value = $_SESSION['user']['level']; 
    } 

    else 
    { 
     $value = 'DEFAULT VALUE IF NOT EXISTS'; 
    } 
} 

else 
{ 
    $value = 'DEFAULT VALUE IF NOT EXISTS'; 
} 

turnos para esto:

Value($_SESSION, array('user', 'level'), 'DEFAULT VALUE IF NOT EXISTS'); 

Aquí es la función:

function Value($array, $key = 0, $default = false) 
{ 
    if (is_array($array) === true) 
    { 
     if (is_array($key) === true) 
     { 
      foreach ($key as $value) 
      { 
       if (array_key_exists($value, $array) === true) 
       { 
        $array = $array[$value]; 
       } 

       else 
       { 
        return $default; 
       } 
      } 

      return $array; 
     } 

     else if (array_key_exists($key, $array) === true) 
     { 
      return $array[$key]; 
     } 
    } 

    return $default; 
} 

PS: También puede utilizar matrices unidimensionales, como esto:

Value($_SERVER, 'REQUEST_METHOD', 'DEFAULT VALUE IF NOT EXISTS'); 
Cuestiones relacionadas