php递归合并
我需要以不同的方式合并一些数组,并使用array\u merge\u recursive。 然而,有些事情我需要改变,我不知道如何改变。 下面是引自php.net的一段话 但是,如果数组具有相同的数字键,则后面的值 不会覆盖原始值,但会追加 我想要这个值,而不是追加,我不想在新数组中追加精确的值。希望您已经理解了这一点 例如:php递归合并,php,arrays,recursion,merge,Php,Arrays,Recursion,Merge,我需要以不同的方式合并一些数组,并使用array\u merge\u recursive。 然而,有些事情我需要改变,我不知道如何改变。 下面是引自php.net的一段话 但是,如果数组具有相同的数字键,则后面的值 不会覆盖原始值,但会追加 我想要这个值,而不是追加,我不想在新数组中追加精确的值。希望您已经理解了这一点 例如: $array = array( 'some' => array( 'other' => 'key', ), ); $arr
$array = array(
'some' => array(
'other' => 'key',
),
);
$array2 = array();
$array2['some']['other'] = 'key2';
如果使用array\u merge\u recursive,则会产生以下结果:
Array (
[some] => Array
(
[other] => Array
(
[0] => key
[1] => key2
)
) )
我想知道它是否匹配同一个结果,而不是附加它。是的,我知道,你会说,然后使用array\u merge,但它也不能很好地工作。
如果我使用这个:
$array = array(
'some' => array(
'other' => 'key',
),
);
$array2 = array();
$array2['some']['other2'] = 'key2';
print_r(array_merge($array, $array2));
它将从列表中删除$array[some][other],只留下$array[some][other2]。我不知道哪个更好,因为没有人能让它更好。试试这个
<?php
function mymerge(&$a,$b){ //$a will be result. $a will be edited. It's to avoid a lot of copying in recursion
foreach($b as $child=>$value){
if(isset($a[$child])){
if(is_array($a[$child]) && is_array($value)){ //merge if they are both arrays
mymerge($a[$child],$value);
}
//else ignore, you can add your own logic, i.e when 1 of them is array
}
else
$a[$child]=$value; //add if not exists
}
//return $a;
}
我为它编写了合并类:
<?php
class ArrayMerge
{
/**
* @param array $a
* @param array $b
*
* @return array
*/
public function merge ( $a, $b ) {
foreach ( $b as $k => $v ) {
if ( is_array( $v ) ) {
if ( isset( $a[ $k ] ) ) {
if ( $this->isDeep( $v ) ) {
$a[ $k ] = $this->merge( $a[ $k ], $v );
} else {
$a[ $k ] = array_merge( $a[ $k ], $v );
}
} else {
$a[ $k ] = $v;
}
} else {
$a[ $k ] = $v;
}
}
return $a;
}
/**
* @param array $array
*
* @return bool
*/
private function isDeep ( $array ) {
foreach ( $array as $elm ) {
if ( is_array( $elm ) ) {
return TRUE;
}
}
return FALSE;
}
}
我从RiaD的版本开始,添加了对象处理。需要测试和反馈
function recursiveMerge(&$a,$b){ //$a will be result. $a will be edited. It's to avoid a lot of copying in recursion
if(is_array($b) || is_object($b)){
foreach($b as $child=>$value){
if(is_array($a)){
if(isset($a[$child]))
recursiveMerge($a[$child],$value);
else
$a[$child]=$value;
}
elseif(is_object($a)){
if(isset($a->{$child}))
recursiveMerge($a->{$child},$value);
else
$a->{$child}=$value;
}
}
}
else
$a=$b;
}
另一种选择是drupal的数组\u merge\u deep
:
function array_merge_deep($arrays) {
$result = array();
foreach ($arrays as $array) {
foreach ($array as $key => $value) {
// Renumber integer keys as array_merge_recursive() does. Note that PHP
// automatically converts array keys that are integer strings (e.g., '1')
// to integers.
if (is_integer($key)) {
$result[] = $value;
}
// Recurse when both values are arrays.
elseif (isset($result[$key]) && is_array($result[$key]) && is_array($value)) {
$result[$key] = array_merge_deep(array($result[$key], $value));
}
// Otherwise, use the latter value, overriding any previous value.
else {
$result[$key] = $value;
}
}
}
return $result;
}
对于PHP>=5.3,只需使用数组中的嵌套有多深?只有一个级别?那么告诉我们你的结果应该是什么?它可能是无限的。我不会只在一个级别上使用它。@scube结果应该是(如果使用array\u merge)而不是从第一个数组中删除上一个项目。第二个示例显示:Array([some]=>Array([other2]=>key2]),我想显示:Array([some]=>Array([other]=>key[other2]=>key2))@Alex:执行该命令时,您希望得到什么:$Array=Array('some'=>Array)('other'=>'key',),);$array2['some']['other']='key2';当使用array\u merge\u recursive时?这是100%正确的答案。