2010-02-03 21 views

Respuesta

53
$array[count($array)-2] 

Debe ser una matriz indexada numéricamente (desde cero). Debes tener al menos 2 elementos para que esto funcione. (Obviamente)

+0

Gracias. Y todo. –

+3

La respuesta de Erik es más correcta, no solo explica el caso que indicó con claves no secuenciales, sino que también funciona con matrices asociativas (matrices con cadenas como claves) –

+1

La pregunta sugiere ligeramente que el sujeto es una matriz lineal . Cuando la matriz contiene un elemento único y se configura error_reporting (E_ALL), mi solución falla con 'Notice: Offset indefinido: -1 en /test.php en la línea 3'. La solución de Erik falla silenciosamente. Eso es malo. – Notinlist

110

Esto funciona incluso en esta matriz:

$array[0] = "hello"; 
$array[5] = "how"; 
$array[9] = "are"; 

end($array); 
echo prev($array); // will print "how" 

Las otras soluciones usando count() están suponiendo que los índices de la matriz van en orden; al usar end y prev para mover el puntero de matriz, obtienes los valores reales. Intenta usar el método count() en la matriz de arriba y fallará.

+4

Esto es brillante. Traté de usar la solución marcada con la marca de verificación, pero no pude hacer que funcione con mis matrices (de 1 a 20 cuentas posibles). Tu solución funcionó a las mil maravillas. Gracias. –

6

Un método que funcionará tanto para asociativo matriz y matriz numérica es usar array_pop() para mostrar el elemento al final de la matriz.

$last = array_pop($array); 
$second_last = array_pop($array); 

// put back the last 
array_push($array, $last); 
+0

@ + 1: gran idea. Gracias – Gowri

15

array_slice toma un desplazamiento negativo como segundo argumento. Esto le dará un único elemento del array que contiene el segundo elemento última:

$arr = array(1,2,3,4,5,6); 
array_slice($arr, -2, 1); 

Si lo que desea es el único valor por sí mismo tiene varias opciones. Si no te importa usar una variable intermedia, puedes obtener el primer valor con [0] o llamar a array_pop o array_shift, ambos necesitan una variable pasada por referencia o recibirás advertencias en modo estricto.

O simplemente podría usar array_sum o array_product, que es un poco hacky pero funciona bien para arreglos de elementos individuales.

+0

Buena solución flexible para obtener puntos variables en una matriz. implode ('', array_slice ($ arr, -2, 1)) lo obtiene en una línea. – Praesagus

11

En cuanto a mí bastante pequeña solución

end($array); 
echo prev($array); 
+1

Esta es la mejor respuesta, la respuesta aceptada es terrible en comparación. – TarranJones

2
// Indexed based array 
$test = array('a','b','c','d','e'); 
$count = count($test); 
print $test[$count-2]; 

// Associative Array 
$months = array(
     'jan'=>'January', 
     'feb' => 'february', 
     'mar' => 'March', 
     'apr' => 'April' 
    ); 

$keys = array_keys($months); 
$count = count($keys); 
print $keys[$count-2]; 
2

Todas las matrices tienen un "puntero interno" que apunta al elemento de la matriz actual, PHP tiene varias funciones que le permiten navegar a través de la array y ver la clave y el valor de los elementos actuales.

  • end() - Mueve el puntero interno de una tabla al último elemento
  • reset() - Fija el puntero interno de una matriz a su primer elemento
  • prev() - Rebobina la matriz puntero interno
  • next() - Avanzar el puntero de matriz interna de una matriz
  • current() - Devolver el elemento actual en una matriz
  • key() - Obtiene una clave de una matriz
  • each() - Devolver la clave actual y el par de valores de una matriz y avanzar el cursor gama

Estas funciones funcionan si la matriz está vacía, secuencial o asociativo y como una matriz no se ha especificado en el ejemplo, he supuesto que esto debe funcionar con cualquier matriz.

$array = array(
    'before_last' => false, 
    'last' => false, 
); 

end($array); /* 
- set pointer to last element -> $array['last'] 
- return new current element value if it exists, -> false 
- else return FALSE 
*/ 

prev($array); /* 
- set pointer one place before current pointer -> $array['before_last'] 
- return new current element value if it exists, -> false 
- else return FALSE 
*/ 

if(!is_null(key($array)){ /* 
- return current element key if it exists -> "before_last" 
- else return NULL 
*/ 
    $before_last_element_value = current($array); /* 
    - return current element value if it exists, -> false 
    - else return FALSE 
    */ 
} 

Como se puede ver el resultado esperado (false) y el resultado para un elemento inexistente es la misma (FALSE) por lo que no se puede comprobar si existe un elemento utilizando el valor de elemento devuelto, un elemento clave es diferente.

La clave puede ser integer o string. El valor puede ser type. source

El key() devuelve el valor de la clave actual, si existe el elemento de lo contrario, devolverá NULL. Una clave válida nunca puede ser NULL, por lo que si se devuelve un valor nulo, podemos determinar que el elemento no existe.

Cuestiones relacionadas