使用PHP数组合并的几则小记

最近在整理自己的另外一个站,需要维护和更新一些数据,经常性地碰到一些数组数据的处理。
大多数时候,函数很少去记,用到的时候,就在网上查查手册,用过之后就一了了知了。
这样的结果就是,没有网络,啥都做不成!
为了能够增加自己对函数的认识度,更加熟悉函数的使用,特别是几个常用数组函数的使用,做个小记,以备后查。

数组合并的相关函数: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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注