为了账号安全,请及时绑定邮箱和手机立即绑定

将列数据的多维数组重组为行数据的多维数组

将列数据的多维数组重组为行数据的多维数组

我具有以下列数据的关联数组:$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'));
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

解决方案1:希望这个简单的方法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]);

}

解决方案2:在这里我们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:在这里我们使用array_shifton $where["date"]。


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


查看完整回答
反对 回复 2019-11-04
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

想看花哨的把戏吗?

(PHP最低版本:5.6)


如果您从中剥离阵列键(id和date),则$where可以使用一个variadic函数并编写一个漂亮而紧凑的小单行代码!而且您不必费心实例化任何result数组-不必大惊小怪。PHP非常出色-忠实拥护者。


输入:


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

方法#1:可变参数array_map()与func_get_args()


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

var_export($comb);

该方法是健壮的,因为它将处理可变数量的“行”和“列”。这是一个带有一些示例的演示。


或者,如果您的年龄低于5.6,则可以使用此方法,但它的灵活性/鲁棒性较差(OP样本数据的字面量更大):


方法2:具有两个输入的array_map()


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

var_export($comb);

两种方法的输出:


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',

  ),

)

我发现array_map()这是我最喜欢的函数,因为它在同一行中创建了结果数组(而不是像array_walk()这样返回真/假结果;或者在完成后使用foreach循环进行打印)。这意味着您可以在不声明结果变量的情况下进行真正的单线打印。


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

要么


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

想看到“幻想”变成“精神幻想”吗?

(演示)


$where = [

    'id' => [12,13,14],

    'date'=>['1999-06-12','2000-03-21','2006-09-31']

];

var_export(array_map(null, ...array_values($where)));

与上面相同的效果,只是语法更简洁。


如果有人试图决定要为自己的项目使用哪种解决方案,那么Alex的迭代array_column()调用将比IMO的Sahil的调用更好,因为它更加灵活/健壮(不需要对所有列名进行硬编码),如果您的输入数组具有变量,则可以立即展开专栏,并且总体上更具简洁性和表现力。


为此,我的最后一个代码片段(schmancy)也适用于可变的输入大小,并且非常简洁。Alex和我的之间的主要区别是null有价值的占位元素的生成。



查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 518 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信