2011-08-31 23 views
10

mam tej tablicy $ wyjście, które wygląda tak:PHP - rozbrojony w wielowymiarowej tablicy

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

i tak dalej ...

Kiedy chcę usunąć drugi element po prostu użyć

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

aby uzyskać następujące:

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

Moje pytanie brzmi: jak usunąć co drugi element każdego elementu z tablicy ([0] [1], [1] [1], [2] [1], [3] [1], ...) do Otrzymuję następujący:

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) nic nie zwraca. –

Odpowiedz

5

można iteracyjne nad tablicy i unset() co chcesz w każdej sub-macierzy:

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

Upewnij się, że dodajesz 'i' jak arnaud ma powyżej, jest to wymagane, aby odwoływać się do niego po wywołaniu rozbrojenia – sMyles

18

nie można zrobić z prostego polecenia, ale można użyć pętla:

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

Bardzo pomocne, dziękuję! Aby dodać do swojej odpowiedzi, jeśli chcesz zachować pozostałe klucze sekwencyjne po rozbrojeniu, możesz dołączyć na końcu (i wewnątrz) 'foreach':' $ output [$ key] = array_values ​​($ output [$ key ]); '. Wartość 'array_values ​​()' spowoduje ponowne wprowadzenie kluczy, tak aby były sekwencyjne począwszy od zera. – Mike

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

Można by użyć kombinacji array_map i array_splice:

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

Problem z unset jest to, że będzie to zostawić indeksy jak byli:

$ 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) 
    } 
} 

Podczas składania zaktualizuje indeksy:

$ 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

Czyste i zadbane:

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

Czyste i zadbane? jak to zrobić? ... – Petah

+0

Sprawia, że ​​chcesz je zobaczyć –

Powiązane problemy