resetear - unset position array php
PHP-desarmado en una matriz multidimensional (5)
Tengo este array $ output que se ve así:
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
)
)
y así...
Cuando quiero eliminar el segundo elemento, solo uso
$output = unset($output[1]);
para obtener lo siguiente:
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
)
)
Mi pregunta es cómo eliminar cada segundo elemento de cada elemento en la matriz ([0] [1], [1] [1], [2] [1], [3] [1], ...) para obtener el seguimiento:
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
)
)
Limpio y aseado:
$f=function(&$a,$k) { unset $a[1]; };
array_walk($arr,$f);
No se puede hacer con un comando simple, pero puede usar un ciclo:
foreach(array_keys($output) as $key) {
unset($output[$key][1]);
}
Puede iterar sobre la matriz y unset()
lo que desea en cada sub-matriz:
foreach($output as &$item) {
unset($item[2]);
}
unset($item); // unset reference
Utilizarías una combinación de array_map
y array_splice
:
function removeSecond( array &$arr )
{
array_splice( $arr, 1, 1 );
}
$out = array_map( ''removeSecond'', $input );
El problema con unset
es que dejará los índices como estaban:
$ 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)
}
}
Mientras el empalme actualizará los índices:
$ 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)
}
}
foreach($array as $key=>$val){ unset($val[1]); }