Desarmar una columna en una matriz multidimensional

3 minutos de lectura

Desarmar una columna en una matriz multidimensional
Giel

Tengo esta matriz $salida 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 de la matriz ([0][1], [1][1], [2][1], [3][1] ,…) para obtener lo siguiente:

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

  • desarmar() no devuelve nada.

    –Álvaro González

    31 ago. 2011 a las 17:18

No se puede hacer con un comando simple, pero puede usar un ciclo:

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

  • ¡Muy útil, gracias! Para agregar a su respuesta, si desea mantener las claves restantes secuenciales después del desarmado, puede incluir al final de (y dentro) de su foreach: $output[$key] = array_values($output[$key]);. El array_values() reorganizará las claves para que sean secuenciales a partir de cero.

    – Miguel

    08 ene.

  • Si desea volver a indexar después de desarmar, simplemente llame array_splice() como demuestra @cwallen.

    – mickmackusa

    31 jul.

Puede iterar sobre la matriz, y unset() lo que quieres en cada sub-arreglo:

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

  • Asegúrese de incluir el & como arnaud tiene arriba, esto es necesario para hacer referencia cuando llama a unset

    – sMyles

    18 abr. 17 en 21:30

1642876984 699 Desarmar una columna en una matriz multidimensional
adngirl

Limpio y aseado:

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

O:

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

  • por qué declarar $k? Nunca lo usas.

    – mickmackusa

    31 jul.


Usarí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 que 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)
  }
}

Desarmar una columna en una matriz multidimensional
fabiog

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

  • Esta respuesta de solo código no afecta al original $array, sino un elemento dentro de una copia de $array. Dentro $val, el 1-El elemento con clave se eliminará, pero $array nunca se muta. Prueba: 3v4l.org/aZ52f

    – mickmackusa

    29 jul.

Yo uso esto:

public function array_unset_key_in_children($array, $keyToUnsetInChildren)
{ 
    $newArray = [];
    foreach($array as $key=>$subArray) { 
        unset($subArray[$keyToUnsetInChild]);
        $newArray[$key] = $subArray;
    }
    return $newArray;
}

  • Esta respuesta de solo código no afecta al original $array, sino un elemento dentro de una copia de $array. Dentro $val, el 1-El elemento con clave se eliminará, pero $array nunca se muta. Prueba: 3v4l.org/aZ52f

    – mickmackusa

    29 jul.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad