tohokuaikiのチラシの裏

技術的ネタとか。

配列をある配列で一部分だけ上書きしたい場合

ある設定配列$configがあるとして、携帯用に$mobile_configってのがあって、だけどその$mobile_configには、$configとの「差分だけ」を書きたいって場合。

<?php
$config = array(
	'num_per_page' => array(
		'news' => 10,
		'article' =>10,
		'member' => 10,
		)
	'dsn' => 'mysql://hoge:hoge@localhost'
	);


$mobile_config => array(
	'num_per_page' => array(
		'article' => 5
		)
	)

とかで、なんかで、むにょむにょっとやると

<?php
$config = array(
	'num_per_page' => array(
		'news' => 10,
		'article' =>5,
		'member' => 10,
		)
	'dsn' => 'mysql://hoge:hoge@localhost'
	);

みたいになってくれるの。

単純なarray_mergeだと、上手くいかない。

んで、array_merge_exって再帰関数を作る。これだと、

<?php
function array_merge_ex(&$arr1, $arr2)
{
	foreach ($arr2 as $key=>$value){
		if (isset($arr1[$key])){
			if (is_array($value)){
					array_merge_ex($arr1[$key], $value);
			}
			else {
				$arr1[$key] = $value;
			}
		}
	}
}



$arr1 = array(
	'var' => array(
		'var1' => 3,
		'var2' => 4,
		'var3' => 6,
		),
	'foo' => 7,
	'bar' => array(
		'bar1' => array(
			'bar1-1' => 'hogehoge',
			'bar1-2' => 'aaaaaaaaaaa'
			),
		),
	);

$arr2 = array(
	'var' => array(
		'var2' => 444444,
		'var4' => 2222222
		),
	'foo' => 777777,
	'bar' => array(
		'bar1' => array(
			'bar1-1' => 'ukiuki'
			),
		),
	);

array_merge_ex($arr1, $arr2);
var_export($arr1);

結果は、

<?php
array (
  'var' =>
  array (
    'var1' => 3,
    'var2' => 444444,
    'var3' => 6,
  ),
  'foo' => 777777,
  'bar' =>
  array (
    'bar1' =>
    array (
      'bar1-1' => 'ukiuki',
      'bar1-2' => 'aaaaaaaaaaa',
    ),
  ),
)

ま、何てことないネタですが。