两个原数组
$arr['id'] = array([0] => '1',[1] => false,[2] => '3',[3] => '4',)$arr['name'] = array([0] => 'zhang',[1] => 'li',[2] => 'du',)
需要生成的数组
array([0]=>array('id'=>'1','name'=<i>本文@来#源gaodai$ma#com搞$$代**码网</i><strong>搞代gaodaima码</strong>>'zhang'),[1]=>array('id'=>false,'name'=>''),[2]=>array('id'=>'3','name'=>'li'),[3]=>array('id'=>'4','name'=>'du'),)
回复内容:
两个原数组
$arr['id'] = array([0] => '1',[1] => false,[2] => '3',[3] => '4',)$arr['name'] = array([0] => 'zhang',[1] => 'li',[2] => 'du',)
需要生成的数组
array([0]=>array('id'=>'1','name'=>'zhang'),[1]=>array('id'=>false,'name'=>''),[2]=>array('id'=>'3','name'=>'li'),[3]=>array('id'=>'4','name'=>'du'),)
我大体理解了一下不知道对不对 …
就是大数组里面的第一个小数组永远是最长的 … 如果在这个数组里有 false
值则补全其他为空白 …
写了段示例代码如下 … 不止可以应用于你的情况 … 源数组更复杂也可以处理 …
<?php/* your array puts here ... primary key must be the first entry ... */$arr = [ 'id' => [ '1', false, '3', '4' ], 'name' => [ 'zhang', 'li', 'du' ]];/* get all key names ... */$keys = array_keys( $arr );/* use a different way to solve this ... */var_export( array_reduce( $arr, function( & $result, $current ) use ( & $keys ) { /* get current key name ... */ $key = array_shift( $keys ); /* first run ..? */ if ( ! isset( $result ) ) /* initialize a new array with primary key... */ $result = array_map( function( $value ) use ( $key ) { /* just packing value as an array ... */ return [ $key => $value ]; /* value based on $current ... known as first entry of $arr ... */ }, $current ); /* when the array is built ... add new keys into it ... */ else foreach ( $result as $num => & $value ) /* leave blank when primary key is false or entry is empty ... */ $value[$key] = ( false !== current( $value ) ) ? array_shift( $current ) ?: '' : ''; /* send the new array back ... */ return $result;} ) );
原理就是根据原数组里面的第一个小数组建立主键 … 然后根据主键把所有元素拼合在一起 …
无所谓每个元素都叫什么名字 … 也无所谓有多少元素 … 除了主键数组之外其他小数组的键值完全不重要 …
总之都按顺序拼在一起拼在一起变成另外一个大数组恩 …
以及说 … 如果小数组的长度超过主键数组长度的话 … 超长的部分会被丢弃 …
主键数组的长度超过小数组的话 … 空缺的部分也会填入空白 …
基本就是这样啦 … 其实吧 … 也可以简单的用 for 循环来完成 … 效率还更高 …
但用 array_reduce() 比较帅适应性也更强不是 ..?
$rev = array();$ix = 0;foreach($arr['id'] as $k=>$v){ $rev[] = array( 'id'=>$v, 'name'=> $v ? $arr['name'][$ix++] : '' );}print_r($rev);
楼上给出来解释和非常漂亮的代码,下面我给个简单实现的。
$arr = array( 'id' => array('1', false, '3', '4' ), 'name' => array('zhang', 'li', 'du' ));foreach ($arr['id'] as $value) { if (intval($value) > 0) { $result[] = array( $value => array_shift($arr['name']) ); } else { $result[] = array( $value => '' ); }}var_dump($result);
不是用array_combine就好了吗……