由一个简单的题目引入:
有一下一个数组$da
$da = array(
'name'=>array('0'=>'张三','1'=>'李四','2'=>'王五'),
'pwd'=>array('0'=>'zs1234','1'=>'wa1234','2'=>'ww1234'),
'tel'=>array('0'=>'13255557785','1'=>'15624845761','2'=>'18547842158')
);
要求将上面的数组$da转换输出数组$de
$de = array(
'0'=>array('name'=>'张三','pwd'=>'zs1234','tel'=>'13255557785'),
'1'=>array('name'=>'李四','pwd'=>'wa1234','tel'=>'15624845761'),
'2'=>array('name'=>'王五','pwd'=>'ww1234','tel'=>'18547842158')
);
首先,想到的是用循环嵌套的思路解决:
$de = [];
$index = ['name', 'pwd', 'tel'];
for($i = 0, $len = count($index); $i < $len; $i++){
for($j = 0, $_len = count($da[$index[$i]]); $j < $_len; $j++){
$de[$j][$index[$i]] = $da[$index[$i]][$j];
}
}
var_dump($de);
上面循环嵌套的方法能顺利的得到我们期望的结果了,这时候我就想,PHP自带的系统函数能不能快速解决上面的问题呢?运用系统函数能够解决问题的话,性能方面应该不会比两层的循环嵌套要差!
于是,有了下面的解题方法:
$de = array_map(null, $da['name'], $da['pwd'], $da['tel']);
foreach($de as &$val){
$val = array_combine(['name', 'pwd', 'tel'], $val);
}
p($de);
对比第一种解决方案,感觉如何?
总结:
主要三个点:
- array_map(), 为数组的每个元素应用回调函数;
- array_combine, 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值;
- 引用的趣用