php arrays multidimensional-array transpose array-column

php - Reestructurar la matriz multidimensional de datos de columna en una matriz multidimensional de datos de fila



arrays multidimensional-array (3)

¿Quieres ver un truco elegante?

( versión mínima de php: 5.6 )

¡Si quita las teclas de matriz ( id y date ) de $where puede usar una función variadic y escribir una pequeña línea apretada y agradable! Y no tiene que molestarse en crear instancias de matrices de result , sin complicaciones. PHP es excelente, gran fan.

Entrada:

$where=[''id''=>[12,13,14],''date''=>[''1999-06-12'',''2000-03-21'',''2006-09-31'']];

Método # 1: variadic array_map () con func_get_args ()

$comb=array_map(function(){return func_get_args();},...array_values($where)); var_export($comb);

Este método es robusto ya que manejará un número variable de "filas" y "columnas". Aquí hay una demostración con algunos ejemplos .

O si tiene menos de 5.6, puede usar esto, pero es menos flexible / robusto (más literal a los datos de muestra del OP):

Método # 2: array_map () con dos entradas

$comb=array_map(function($v1,$v2){return [$v1,$v2];},$where[''id''],$where[''date'']); var_export($comb);

Salida de cualquiera de los métodos:

array ( 0 => array ( 0 => 12, 1 => ''1999-06-12'', ), 1 => array ( 0 => 13, 1 => ''2000-03-21'', ), 2 => array ( 0 => 14, 1 => ''2006-09-31'', ), )

Encuentro que array_map() es mi función favorita para este caso porque crea la matriz de resultados en la misma línea (en lugar de devolver un resultado verdadero / falso como array_walk (); o usando un bucle foreach e imprimiendo después de hacerlo) . Esto significa que puede hacer una verdadera impresión de una línea sin declarar una variable de resultado ...

var_export(array_map(function(){return func_get_args();},...array_values($where)));

o

var_export(array_map(function($v1,$v2){return [$v1,$v2];},$where[''id''],$where[''date'']));

¿Quieres ver "fantasía" hecha "schmancy"?

( Demo )

$where = [ ''id'' => [12,13,14], ''date''=>[''1999-06-12'',''2000-03-21'',''2006-09-31''] ]; var_export(array_map(null, ...array_values($where)));

Este es el mismo efecto que el anterior, solo que con una sintaxis más sucinta.

Si alguien intenta decidir qué solución usar para su propio proyecto, la array_column() iterada array_column() Alex es superior a la de IMO de Sahil, porque es más flexible / robusta (no requiere codificación de todos los nombres de columna), expandible instantáneamente si su entrada La matriz tiene una columna variable, y es más sucinta y expresiva en general.

Para el caso, mi fragmento final (el schmancy) también es adecuado para tamaños de entrada variables y es muy conciso. La principal diferencia entre Alex y la mía es la generación de elementos de fijación de posición de valor null .

Tengo la siguiente matriz asociativa de datos de columna:

$where = array( ''id''=>array( 12, 13, 14 ), ''date''=>array( ''1999-06-12'', ''2000-03-21'', ''2006-09-31'' ) );

Necesito transponer / rotar la estructura para que sea una matriz de filas (con datos de columna combinados asignados a sus respectivas filas). No necesito los nombres de columna en el resultado.

Rendimiento esperado:

$comb = array( array(12, ''1999-06-12''), array(13, ''2000-03-21''), array(14, ''2006-09-31'') );


Como Kris Roofe declaró en su respuesta eliminada, array_column es de hecho una forma más elegante. Solo asegúrate de ponerlo en una especie de bucle foreach , similar a lo que te mostró Sahil Gulati. Por ejemplo, así:

$result = array(); foreach($where[''id''] as $k => $v) { $result[] = array_column($where, $k); }

La salida var_dump de $result es exactamente lo que estás buscando

array(3) { [0]=> array(2) { [0]=> int(12) [1]=> string(10) "1999-06-12" } [1]=> array(2) { [0]=> int(13) [1]=> string(10) "2000-03-21" } [2]=> array(2) { [0]=> int(14) [1]=> string(10) "2006-09-31" } }


Solución 1: Espero que este simple foreach obtenga el resultado deseado

Prueba este fragmento de código aquí

<?php ini_set(''display_errors'', 1); $where = array(''id''=>array(12,13,14),''date''=>array(''1999-06-12'',''2000-03-21'',''2006-09-31'')); $result=array(); foreach($where["id"] as $key => $value) { $result[]=array($value,$where["date"][$key]); }

Solución 2: Aquí estamos usando array_walk para lograr el mismo resultado

Prueba este fragmento de código aquí

<?php ini_set(''display_errors'', 1); $result=array(); $where = array(''id''=>array(12,13,14),''date''=>array(''1999-06-12'',''2000-03-21'',''2006-09-31'')); array_walk($where["id"], function($value,$key) use(&$result,&$where){ $result[]=array($value,$where["date"][$key]); }); print_r($result);

Solución 3: Aquí estamos usando array_shift en $where["date"] .

Prueba este fragmento de código aquí

<?php ini_set(''display_errors'', 1); $result=array(); $where = array(''id''=>array(12,13,14),''date''=>array(''1999-06-12'',''2000-03-21'',''2006-09-31'')); foreach($where["id"] as $value) { $result[]=array($value, array_shift($where["date"])); } print_r($result);