2011-08-31 15 views
10

ho questo $ uscita serie che assomiglia a questo:PHP - impostata in un array multidimensionale

Array(
    [0] => Array(
     [0] => 1a 
     [1] => 1b 
     [2] => 1c 
    ) 
    [1] => Array(
     [0] => 2a 
     [1] => 2b 
     [2] => 2c 
    ) 
    [2] => Array(
     [0] => 3a 
     [1] => 3b 
     [2] => 3c 
    ) 
    [3] => Array(
     [0] => 4a 
     [1] => 4b 
     [2] => 4c 
    ) 
) 

e così via ...

Quando voglio togliere il secondo elemento mi basta usare

$output = unset($output[1]); 

per ottenere quanto segue:

Array(
    [0] => Array(
     [0] => 1a 
     [1] => 1b 
     [2] => 1c 
    ) 
    [1] => Array(
     [0] => 3a 
     [1] => 3b 
     [2] => 3c 
    ) 
    [2] => Array(
     [0] => 4a 
     [1] => 4b 
     [2] => 4c 
    ) 
) 

La mia domanda è come rimuovere ogni secondo elemento di ogni elemento dell'array ([0] [1], [1] [1], [2] [1], [3] [1], ...) a il seguente:

Array(
    [0] => Array(
     [0] => 1a 
     [1] => 1c 
    ) 
    [1] => Array(
     [0] => 2a 
     [1] => 2c 
    ) 
    [2] => Array(
     [0] => 3a 
     [1] => 3c 
    ) 
    [3] => Array(
     [0] => 4a 
     [1] => 4c 
    ) 
) 
+0

[unset()] (http://es.php.net/unset) non restituisce nulla. –

risposta

5

È possibile iterare l'array, e unset() ciò che si desidera in ogni sotto-array:

foreach($output as &$item) { 
    unset($item[2]); 
} 
unset($item); // unset reference 
+1

Assicurati di includere '&' come arnaud ha sopra, questo è necessario per fare riferimento quando si chiama unset – sMyles

18

non può essere fatto con un semplice comando, ma è possibile utilizzare a loop:

foreach(array_keys($output) as $key) { 
    unset($output[$key][1]); 
} 
+1

Molto utile, grazie! Per aggiungere alla tua risposta, se vuoi mantenere sequenziali le tue chiavi rimanenti dopo l'annullamento, puoi includere alla fine di (e all'interno) il tuo 'foreach':' $ output [$ key] = array_values ​​($ output [$ key ]); '. 'Array_values ​​()' rebase le chiavi in ​​modo che siano sequenziali partendo da zero. – Mike

1
foreach($array as $key=>$val){ unset($val[1]); } 
1

devi usare una combinazione di array_map e array_splice:

function removeSecond(array &$arr) 
{ 
    array_splice($arr, 1, 1); 
} 
$out = array_map('removeSecond', $input); 

Il problema con unset è che lascerà gli indici come erano:

$ php -r '$arr = array(array(0,1,2)); unset($arr[0][1]); var_dump($arr);' 
array(1) { 
    [0]=> 
    array(2) { 
    [0]=> 
    int(0) 
    [2]=> 
    int(2) 
    } 
} 

Mentre giunzione aggiornerà gli indici:

$ php -r '$arr = array(array(0,1,2)); array_splice($arr[0], 1, 1); var_dump($arr);' 
array(1) { 
    [0]=> 
    array(2) { 
    [0]=> 
    int(0) 
    [1]=> 
    int(2) 
    } 
} 
1

Pulito e ordinato:

$f=function(&$a,$k) { unset $a[1]; }; 
array_walk($arr,$f); 
+1

Pulito e ordinato? come mai? ... – Petah

+0

Ti piace e-slap em –