2010-01-04 22 views
6

tengo una matriz que puede contener teclas numéricas o asociativas, o ambos:Cómo eliminar los valores de una matriz, mientras que la renumeración de teclas numéricas

$x = array('a', 'b', 'c', 'foo' => 'bar', 'd', 'e'); 
print_r($x); 
/*(
    [0] => a 
    [1] => b 
    [2] => c 
    [foo] => bar 
    [3] => d 
    [4] => e 
)*/ 

Quiero ser capaz de eliminar un elemento de la matriz, renumeración las teclas no asociativos para mantenerlos secuencial:

$x = remove($x, "c"); 
print_r($x); 
/* desired output: 
(
    [0] => a 
    [1] => b 
    [foo] => bar 
    [2] => d 
    [3] => e 
)*/ 

Encontrar el elemento derecho a eliminar no es un problema, son las claves que son el problema. unset no vuelve a numerar las claves, y array_splice funciona en un offset, en lugar de una clave (es decir: tomar $ x del primer ejemplo, array_splice($x, 3, 1) eliminaría el elemento "bar" en lugar del elemento "d").

Respuesta

13

esto debe volver a indexar la matriz, preservando claves de cadena:

$x = array_merge($x); 
0

Yo he llegado con esto - aunque no estoy seguro si es el mejor:

// given: $arr is the array 
//  $item is the item to remove 

$key = array_search($item, $arr); // the key we need to remove 
$arrKeys = array_keys($arr); 
$keyPos = array_search($key, $arrKeys); // the offset of the item in the array 

unset($arr[$key]); 
array_splice($arrKeys, $keyPos, 1); 

for ($i = $keyPos; $i < count($arrKeys); ++$i) { 
    if (is_int($arrKeys[$i])) --$arrKeys[$i]; // shift numeric keys back one 
} 
$arr = array_combine($arrKeys, $arr); // recombine the keys and values. 

Hay algunas cosas que he dejado fuera, sólo por el bien de la brevedad. Por ejemplo, verificaría si la matriz es asociativa, y también si la clave que está eliminando es una cadena o no antes de usar el código anterior.

0

Try array_diff() que no podrá ordenar la nueva matriz correctamente aunque si no el siguiente debe funcionar

Tendrá que iterar sobre ella en la función de eliminación.

function remove($x,$r){ 
$c = 0; 
$a = array(); 
foreach ($x as $k=>$v){ 
    if ($v != $r) { 
    if (is_int($k)) { 
     $a[$c] = $v; 
     $c++; 
    } 
    else { 
     $a[$k] = $v; 
    } 
    } 
} 
return $a; 
} 

DC

0

No creo que hay una solución elegante a este problema, es probable que tenga un bucle a la matriz y reordenar las teclas por sí mismo.

2

Puede fixet con la próxima solución elegante:

Por ejemplo:

 
<?php 

$array = array (
    1 => 'A', 
    2 => 'B', 
    3 => 'C' 
); 

unset($array[2]); 

/* $array is now: 
Array (
    1 => 'A', 
    3 => 'C' 
); 
As you can see, the index '2' is missing from the array. 
*/ 

// SOLUTION: 
$array = array_values($array); 

/* $array is now: 
Array (
    0 => 'A', 
    1 => 'C' 
); 
As you can see, the index begins from zero. 
*/ 
?> 
+0

Esto eliminará todos los no - teclas numéricas. Por favor, lea la pregunta original nuevamente. – nickf

Cuestiones relacionadas