将列数据的多维数组重组为行数据的多维数组
Restructure multidimensional array of column data into multidimensional array of row data
我有以下列数据的关联数组:
$where = array(
'id'=>array(
12,
13,
14
),
'date'=>array(
'1999-06-12',
'2000-03-21',
'2006-09-31'
)
);
我需要将结构转置/旋转为行数组(将合并的列数据分配给各自的行)。我不需要结果中的列名。
预期输出:
$comb = array(
array(12, '1999-06-12'),
array(13, '2000-03-21'),
array(14, '2006-09-31')
);
解决方案一:希望这个简单的foreach
得到想要的结果
<?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]);
}
方案二:这里我们使用array_walk
来达到同样的效果
<?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);
解决方案 3: 这里我们在 $where["date"]
.
上使用 array_shift
<?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);
正如 Kris Roofe 在他删除的答案中所说的那样,array_column
确实是一种更优雅的方式。请务必将其放入某种 foreach
循环中,类似于 Sahil Gulati 向您展示的内容。例如,像这样:
$result = array();
foreach($where['id'] as $k => $v)
{
$result[] = array_column($where, $k);
}
$result
的 var_dump
输出正是您要查找的内容
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"
}
}
我已经完全重写了我的答案,因为它不必要地膨胀了这个页面。事实上,有一种非常干净和原生的方式来处理这个“转置”的特定任务。只需要使用 null
作为函数参数并传入输入数组中的两个已知行即可。
代码:(Demo)
$where = [
'id' => [12, 13, 14],
'date' => ['1999-06-12', '2000-03-21', '2006-09-31']
];
var_export(
array_map(null, $where['id'], $where['date'])
);
输出:
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',
),
)
对于真正需要动态解决方案的人(因为行数可能 fluxuate/change 而你不想继续维护处理代码),那么我建议你检查 the version history of my answer .
我有以下列数据的关联数组:
$where = array(
'id'=>array(
12,
13,
14
),
'date'=>array(
'1999-06-12',
'2000-03-21',
'2006-09-31'
)
);
我需要将结构转置/旋转为行数组(将合并的列数据分配给各自的行)。我不需要结果中的列名。
预期输出:
$comb = array(
array(12, '1999-06-12'),
array(13, '2000-03-21'),
array(14, '2006-09-31')
);
解决方案一:希望这个简单的foreach
得到想要的结果
<?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]);
}
方案二:这里我们使用array_walk
来达到同样的效果
<?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);
解决方案 3: 这里我们在 $where["date"]
.
array_shift
<?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);
正如 Kris Roofe 在他删除的答案中所说的那样,array_column
确实是一种更优雅的方式。请务必将其放入某种 foreach
循环中,类似于 Sahil Gulati 向您展示的内容。例如,像这样:
$result = array();
foreach($where['id'] as $k => $v)
{
$result[] = array_column($where, $k);
}
$result
的 var_dump
输出正是您要查找的内容
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"
}
}
我已经完全重写了我的答案,因为它不必要地膨胀了这个页面。事实上,有一种非常干净和原生的方式来处理这个“转置”的特定任务。只需要使用 null
作为函数参数并传入输入数组中的两个已知行即可。
代码:(Demo)
$where = [
'id' => [12, 13, 14],
'date' => ['1999-06-12', '2000-03-21', '2006-09-31']
];
var_export(
array_map(null, $where['id'], $where['date'])
);
输出:
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',
),
)
对于真正需要动态解决方案的人(因为行数可能 fluxuate/change 而你不想继续维护处理代码),那么我建议你检查 the version history of my answer .