2011-11-20 19 views
9

Ho una matrice con 4 valori. Vorrei rimuovere il valore in 2a posizione e spostare il resto della chiave in basso di uno.Come rimuovo una chiave specifica in un array usando php?

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

prima di rimuovere la chiave al 2 ° posto:

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

Dopo desidero restanti chiavi per ridurre di una per riempire lo spazio della chiave

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

Ho provato a utilizzare unset() sulla chiave specifica, ma non avrebbe spostato i tasti rimanenti. Come rimuovo una chiave specifica in un array usando php?

+0

possibile duplicato del [rimuovi linea da array chiave] (http: // StackOverflow .com/questions/1782041/remove-line-from-array-by-key) – hakre

risposta

6

È necessario array_values($b) per reimpostare la matrice in modo che le chiavi siano sequenziali e numeriche (a partire da 0).

Il seguente dovrebbe fare il trucco:

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

+1: basta aggiungere un segno di spunta: 'array_key_exists' se pensi di fare questa dinamica :) – Nonym

2

Usa array_splice().

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

Se si desidera rimuovere un elemento da un array in una posizione specifica, è possibile ottenere la chiave per quella posizione e poi non impostato:

$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]); 

Questo funziona con qualsiasi array PHP, a prescindere dove inizia l'indicizzazione o se le stringhe vengono utilizzate per le chiavi.

Se si desidera rinumerare la matrice restante basta usare array_values:

$b = array_values($b); 

che vi darà una a base zero, array indicizzato numericamente.

Se la matrice originale è un a base zero, array indicizzato numericamente così (come nella tua domanda), è possibile saltare la parte su come ottenere la chiave:

$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 direttamente utilizzare array_splice che si occupa di offset invece di chiavi e re-indici della matrice (tasti numerici in ingresso non vengono mantenute):

$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

Nessuno ha proposto un metodo con array_diff_key(), così sarò per completezza.

Codice:

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

uscita:

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

Questo metodo non solo fornisce il risultato atteso in un one-liner, è sicuro da usare senza una condizione array_key_exists().

Questo metodo fornisce inoltre la funzionalità aggiuntiva di consentire la rimozione di più elementi tramite la chiave in un unico passaggio. La soluzione di JJJ consente anche questo, ma solo con elementi consecutivi. array_diff_key() offre la flessibilità di rimuovere le chiavi indipendentemente dalla loro posizione nell'array.

codice per rimuovere gli elementi 2 ° e 4 ° (tasti 1 e 3):

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

uscita:

array (
    0 => 123, 
    1 => 789, 
) 
Problemi correlati