2010-01-04 12 views
6

Ho una matrice che può contenere tasti numerici o associative, o entrambi:Come rimuovere i valori da un array mentre rinumerazione tasti numerici

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

voglio essere in grado di rimuovere un elemento dalla matrice, rinumerazione le chiavi non-associativi per tenerli sequenziale:

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

Trovare l'elemento diritto di rimuovere non è un problema, sono le chiavi che sono il problema. unset non rinumera le chiavi e array_splice funziona su uno offset, anziché su una chiave (ad esempio: prendere $ x dal primo esempio, array_splice($x, 3, 1) rimuove l'elemento "bar" anziché l'elemento "d").

risposta

13

Questo dovrebbe ri-index dell'array preservando chiavi stringa:

$x = array_merge($x); 
0

mi è venuta in mente questo - anche se non sono sicuro se è il migliore:

// 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. 

Ci sono alcune cose che ho lasciato fuori, solo per brevità. Ad esempio, verificherai se l'array è associativo e anche se la chiave che stai rimuovendo è una stringa o meno prima di utilizzare il codice precedente.

0

Try array_diff() non può ordinare il nuovo array correttamente se se non il seguente dovrebbe funzionare

Sarà necessario scorrere su di esso nella funzione di rimozione.

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

Non credo che ci sia una soluzione elegante a questo problema, probabilmente bisogno di ciclo per l'array e riordinare le chiavi da soli.

2

È possibile fixet con successiva soluzione elegante:

Ad esempio:

 
<?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

Questo eliminerà tutti i materiali non - chiavi numeriche. Si prega di leggere di nuovo la domanda originale. – nickf

Problemi correlati