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