最近在整理自己的另外一个站,需要维护和更新一些数据,经常性地碰到一些数组数据的处理。
大多数时候,函数很少去记,用到的时候,就在网上查查手册,用过之后就一了了知了。
这样的结果就是,没有网络,啥都做不成!
为了能够增加自己对函数的认识度,更加熟悉函数的使用,特别是几个常用数组函数的使用,做个小记,以备后查。
数组合并的相关函数:array_merge, array_merge_recursive, array_combine
一、array_merge示例
它可以将两个或以上的数组合并成一个新的数组,在合并数组元素的时候,合并的顺序是按照原有数组被呼叫到的顺序来决定。
1、一般合并
一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
$post = array( 'ID' => 163, 'post_title' => 'netease', 'post_date' => '2011-11-05 15:08:36' ); $netease = array( 'logo' => 'http://img3.cache.netease.com/www/logo/logo_png.png' ); $response = array_merge( $post, $netease ); print_r( $response );
结果为:
Array ( [ID] => 163 [post_title] => netease [post_date] => 2011-11-05 15:08:36 [logo] => http://img3.cache.netease.com/www/logo/logo_png.png )
2、覆盖合并
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。
$netease = array( 'post_title' => 'netease.com', 'logo' => 'http://img3.cache.netease.com/www/logo/logo_png.png' ); $response = array_merge( $post, $netease ); print_r( $response );
结果为:
Array ( [ID] => 163 [post_title] => netease.com [post_date] => 2011-11-05 15:08:36 [logo] => http://img3.cache.netease.com/www/logo/logo_png.png )
这是两种简单的数组合并方式,也许你看到post_title,post_date时甚感熟悉,不错,这与wordpress有关。
说到wordpress, 那就找个wordpress里的例子看看。
wp_insert_post 是个很典型的新增日志的例子,传递的参数$postarr是一个可以手动指定的数组。
默认情况下,包含的内容是指函数体内的$defaults.
function wp_insert_post($postarr, $wp_error = false) { global $wpdb, $wp_rewrite, $user_ID; $defaults = array('post_status' => 'draft', 'post_type' => 'post', 'post_author' => $user_ID, 'ping_status' => get_option('default_ping_status'), 'post_parent' => 0, 'menu_order' => 0, 'to_ping' => '', 'pinged' => '', 'post_password' => '', 'guid' => '', 'post_content_filtered' => '', 'post_excerpt' => '', 'import_id' => 0, 'post_content' => '', 'post_title' => ''); $postarr = wp_parse_args($postarr, $defaults); ... } function wp_parse_args( $args, $defaults = '' ) { if ( is_object( $args ) ) $r = get_object_vars( $args ); elseif ( is_array( $args ) ) $r =& $args; else wp_parse_str( $args, $r ); if ( is_array( $defaults ) ) return array_merge( $defaults, $r ); return $r; }
注意看wp_parse_args中array_merge( $defaults, $r );
3、+ 与 array_merge的区别
数组键名为数字键名时,要合并的两个数组中有同名数字KEY的时候,使用array_merge()不会覆盖掉原来的值,而使用“+”合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(注意:不是覆盖而是保留最先出现的那个值)。例子:
$arrayarray1 = array(1=>'0'); $arrayarray2 = array(1=> "data"); $result1 = $array2 + $array1;/*结果为$array2的值*/ print_r($result); $result = $array1 + $array2 ;/*结果为$array1的值*/ print_r($result); $result3 = array_merge($array2,$array1);/*结果为$array2和$array1的值,键名被重新分配*/ print_r($result3); $result4 = array_merge($array1,$array2);/*结果为$array1和$array2的值,键名被重新分配*/ print_r($result4);
输出结果为:
Array ( [1] => data ) Array ( [1] => 0 ) Array ( [0] => data [1] => 0 ) Array ( [0] => 0 [1] => data )
二、array_merge_recursive示例
递归地合并一个或多个数组。
功能与array_merge,唯一的区别是在追加时发现要添加的键已存在时,array_merge()的处理方式是覆盖前面的键值,array_merge_recursive()的处理方式是重构子数组,将重复的键的值组成一个新的数值数组。
有点难理解,来个示例吧
$post_meta = array( 'baidu' => array( 'logo' => 'http://www.baidu.com/img/baidu_sylogo1.gif', 'url' => 'http://www.baidu.com' ), 'google' => array( 'logo' => 'http://www.google.com.hk/logos/2011/curie11-hp.jpg', 'url' => 'http://www.google.com' ) ); $post_meta_ext = array( 'baidu' => array( 'pagerank' => '10' ), 'google' => array( 'pagerank' => '10', 'alex' => '2011' ) ); $results = array_merge_recursive( $post_meta, $post_meta_ext ); print_r( $results );
结果为:
array(2) { ["baidu"] => array(3) { ["logo"] => string(42) "http://www.baidu.com/img/baidu_sylogo1.gif" ["url"] => string(20) "http://www.baidu.com" ["pagerank"] => string(2) "10" } ["google"] => array(4) { ["logo"] => string(50) "http://www.google.com.hk/logos/2011/curie11-hp.jpg" ["url"] => string(21) "http://www.google.com" ["pagerank"] => string(2) "10" ["alex"] => string(4) "2011" } }
当数值为数组时,利用array_merge_recursive可以递归地对数组实行扩展合并。
示例2:
$post_meta_ext1 = array( 'baidu' => array( 'pagerank' => '10', 'url' => 'http://mp3.baidu.com' ), 'google' => array( 'pagerank' => '10', 'alex' => '2011' ) ); $results = array_merge_recursive( $post_meta, $post_meta_ext1 ); print_r( $results );
结果为:
array(2) { ["baidu"] => array(3) { ["logo"] => string(42) "http://www.baidu.com/img/baidu_sylogo1.gif" ["url"] => array(2) { [0] => string(20) "http://www.baidu.com" [1] => string(20) "http://mp3.baidu.com" <--看这里,键名相同时,并不像array_merge一样进行覆盖,而是构造并返回新数组,键名自动索引 } ["pagerank"] => string(2) "10" } ["google"] => array(4) { ["logo"] => string(50) "http://www.google.com.hk/logos/2011/curie11-hp.jpg" ["url"] => string(21) "http://www.google.com" ["pagerank"] => string(2) "10" ["alex"] => string(4) "2011" } }
三、array_combine示例
简单说,array_combine返回一个新的数组,参数数组一的值作新数组的键,参数数组二的值作新数组的值。
示例:
$options_key = array('baidu', 'google'); $options_value = array('http://www.baidu.com', 'http://www.google.com'); $options = array_combine( $options_key, $options_value ); print_r( $options );
结果为:
Array ( [baidu] => http://www.baidu.com [google] => http://www.google.com )
关于数组的合并,就先到这吧。
参考资料:
http://www.php.net/manual/zh/function.array-merge.php
http://www.php.net/manual/zh/function.array-merge-recursive.php
http://www.php.net/manual/zh/function.array-combine.php
http://developer.51cto.com/art/200911/164712.htm
http://3619523.blog.51cto.com/3609523/671931