2011-11-20 10 views
9

Tengo una matriz con 4 valores. Me gustaría eliminar el valor en la segunda posición y luego tener el resto de la tecla hacia abajo.¿Cómo elimino una clave específica en una matriz usando php?

$b = array(123,456,789,123); 

antes de retirar la llave en la segunda posición:

Array ([0] => 123 [1] => 456 [2] => 789 [3] => 123)

Después me gustaría las llaves restantes se reduce de marcha uno para llenar el espacio de la falta clave

array ([0] => 123 [1] => 789 [2] => 123)

Intenté usar unset() en la tecla específica, pero no cambiaría las teclas restantes. ¿Cómo elimino una clave específica en una matriz usando php?

+0

posible duplicado de [eliminar la línea de matriz por clave] (http: // stackoverflow .com/questions/1782041/remove-line-from-array-by-key) – hakre

Respuesta

6

Necesita array_values($b) para cambiar la clave de la matriz de forma que las teclas sean secuenciales y numéricas (comenzando en 0).

El siguiente debe hacer el truco:

$b = array(123,456,789,123); 
unset($b[1]); 
$b = array_values($b); 
echo "<pre>"; print_r($b); 
+0

+1: simplemente agregue un cheque: 'array_key_exists' si alguna vez planea hacer esto dinámico :) – Nonym

2

Uso array_splice().

array_splice($b, 1, 1); 
// $b == Array ([0] => 123 [1] => 789 [2] => 123) 
0

Si desea eliminar un elemento de una matriz en una posición específica, se puede obtener la clave para esa posición y luego desasignarla:

$b = array(123,456,789,123); 
$p = 2; 
$a = array_keys($b); 
if ($p < 0 || $p >= count($a)) 
{ 
    throw new RuntimeException(sprintf('Position %d does not exists.', $p)); 
} 
$k = $a[$p-1]; 
unset($b[$k]); 

Esto funciona con cualquier matriz PHP, sin tener en cuenta donde comienza la indexación o si se usan cadenas para las claves.

Si desea volver a numerar la matriz restante sólo tiene que utilizar array_values:

$b = array_values($b); 

que le dará un arreglo indexado numéricamente de base cero.

Si la matriz original es un arreglo indexado numéricamente de base cero, así (como en su pregunta), puede omitir la parte sobre la obtención de la clave:

$b = array(123,456,789,123); 
$p = 2; 
if ($p < 0 || $p >= count($b)) 
{ 
    throw new RuntimeException(sprintf('Position %d does not exists.', $p)); 
} 
unset($b[$p-1]); 
$b = array_values($b); 

O directamente utilice array_splice que se ocupa de compensaciones en lugar de teclas y re-índices del array (teclas numéricas en la entrada no se conservan):

$b = array(123,456,789,123); 
$p = 2; 
if ($p < 0 || $p >= count($b)) 
{ 
    throw new RuntimeException(sprintf('Position %d does not exists.', $p)); 
} 
array_splice($b, $p-1, 1); 
1

Nadie ha ofrecido un método con array_diff_key(), así que lo esté completo.

Código:

var_export(array_values(array_diff_key($b,[1=>'']))); 

de salida:

array (
    0 => 123, 
    1 => 789, 
    2 => 123, 
) 

Este método no sólo proporciona el resultado esperado en una sola línea, es seguro de usar sin una condición array_key_exists().

Este método también proporciona la característica adicional de permitir la eliminación de elementos múltiples por clave en un solo paso. La solución de JJJ también permite esto, pero solo con elementos consecutivos. array_diff_key() ofrece la flexibilidad de eliminar claves independientemente de su posición en la matriz.

código para eliminar 2ª y 4ª elementos (las teclas 1 y 3):

var_export(array_values(array_diff_key($b,[1=>'',3=>'']))); 

de salida:

array (
    0 => 123, 
    1 => 789, 
) 
Cuestiones relacionadas