2010-01-04 14 views
38

Si tiene una matriz asociativa:PHP: Obtener enésimo elemento de una matriz asociativa

Array 
(
    [uid] => Marvelous 
    [status] => 1 
    [set_later] => Array 
     (
      [0] => 1 
      [1] => 0 
     ) 

    [op] => Submit 
    [submit] => Submit 
) 

Y desea acceder al segundo elemento, ¿cómo hacerlo? $arr[1] no parece estar funcionando:

foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) { 
    if (! $setLater) { 
     $valueForAll = $form_state['values'][$fieldKey]; 
     $_SESSION[SET_NOW_KEY][array_search($valueForAll, $form_state['values'])] = $valueForAll; // this isn't getting the value properly 
    } 
} 

Este código se supone que produce:

$_SESSION[SET_NOW_KEY]['status'] = 1 

Sin embargo, sólo produce una entrada en blanco.

+0

¿Es posible cambiar las claves en set_later ser los nombres de los campos? por lo que $ form_state [ 'valores'] [ 'set_later'] = array ('uid' => 1, 'status' => 0)? Eso resolvería el problema y eliminar la necesidad de array_search. – Kevin

Respuesta

47

Uso array_slice

$second = array_slice($array, 1, 1); // array("status" => 1) 

// or 

list($value) = array_slice($array, 1, 1); // 1 

// or 

$blah = array_slice($array, 1, 1, true); // array(0 => 1) 
$value = $blah[0]; 
+0

Configuración del parámetro perserve_keys param de array_slice() parece no tener ningún efecto para mí: http://sandbox.onlinephpfunctions.com/code/05e880de8805ff45f652743e1a309f598fac245f - En lugar de devolver una matriz con clave, me gustaría poder acceder al valor como $ blah [0] (como en el ejemplo anterior). En cambio, todavía tengo que buscar el valor que estoy buscando por su clave, no por su posición. – jonathanbell

+0

Para mi aplicación, necesitaba buscar el enésimo artículo y eliminarlo, y terminé dándome cuenta de que 'array_splice' (en lugar de' array_slice') hace ambas cosas. – thomasrutter

+0

La última opción no parece funcionar como se describe. En cuanto a [docs] (http://php.net/manual/en/function.array-slice.php), indican * preserve_keys: Tenga en cuenta que array_slice() reordenará y restablecerá los índices de matriz numérica de forma predeterminada. Puede cambiar este comportamiento estableciendo preserve_keys en TRUE. * Esto significa que la última opción da como resultado 'array ("status" => 1) ' – DelightedD0D

5

Puede utilizar array_slice para conseguir el segundo elemento:

$a= array(
'hello'=> 'world', 
'how'=> 'are you', 
'an'=> 'array', 
); 

$second= array_slice($a, 1, 1, true); 
var_dump($second); 
0

Si la matriz que proporcione en el primer ejemplo corresponde a $ form_state continuación

$form_state['values']['set_later'][1] 

funcionará.

De lo contrario

$i = 0; 
foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) { 
    if ($i == 1) { 
     $valueForAll = $form_state['values'][$fieldKey]; 
     $_SESSION[SET_NOW_KEY][$fieldKey] = $setLater; 
     continue; 
    } 
    $i++; 
} 
13

estoy un poco confundido. Su código no parece tener las claves correctas para la matriz. Sin embargo, si desea tomar sólo el segundo elemento de una matriz, se puede utilizar:

$keys = array_keys($inArray); 
$key = $keys[1]; 
$value = $inArray[$key]; 

Sin embargo, después de considerar lo que parece que está tratando de hacer, algo como esto podría funcionar mejor:

$ii = 0; 
$setLaterArr = $form_state['values']['set_later']; 
foreach($form_state['values'] as $key => $value) { 
    if($key == 'set_later') 
     continue; 
    $setLater = $setLaterArr[$ii]; 
    if(! $setLater) { 
     $_SESSION[SET_NOW_KEY][$key] = $value; 
    } 
    $ii ++; 
} 

¿Eso ayuda? Parece que está intentando establecer el valor de la sesión si el valor set_later no está establecido. El código anterior hace esto. Sin embargo, en lugar de iterar a través de la matriz interna, itera a través de la matriz externa y usa un índice para rastrear dónde se encuentra en la matriz interna. Esto debería ser razonablemente eficiente.

0

Cada una de las respuestas aquí se centran en conseguir el segundo elemento, independientemente de cómo se forma la matriz.

Si este es tu caso.

Array 
(
    [uid] => Marvelous 
    [status] => 1 
    [set_later] => Array 
     (
      [0] => 1 
      [1] => 0 
     ) 

    [op] => Submit 
    [submit] => Submit 
) 

A continuación, se puede obtener el valor del segundo elemento a través $array['status'].

También este código

foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) { 
    if (! $setLater) { 
     $valueForAll = $form_state['values'][$fieldKey]; 
     $_SESSION[SET_NOW_KEY][array_search($valueForAll, $form_state['values'])] = $valueForAll; // this isn't getting the value properly 
    } 
} 

No entiendo lo que estás tratando de hacer, el cuidado de explicar?

0

Aquí está una manera una línea de hacerlo con array_slice y current

$value = current(array_slice($array, 1, 1)); // returns value only 
Cuestiones relacionadas