PHP';整数键上的s数组\合并\递归行为
是否有一种递归合并数组的方法,与PHP的PHP';整数键上的s数组\合并\递归行为,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,是否有一种递归合并数组的方法,与PHP的array\u merge\u recursive()函数的方法相同,只是整数键被视为与字符串键相同 (对于这个过程来说,关键点仍然可以作为整数进行解析,这一点很重要。) 例如: $a = array( 'a' => array(1) ); $b = array( 'a' => array(2, 3) ); var_dump(array_merge_recursive($a, $b)); 将在“a”键上合并,并按预期输出以下内
array\u merge\u recursive()
函数的方法相同,只是整数键被视为与字符串键相同
(对于这个过程来说,关键点仍然可以作为整数进行解析,这一点很重要。)
例如:
$a = array(
'a' => array(1)
);
$b = array(
'a' => array(2, 3)
);
var_dump(array_merge_recursive($a, $b));
将在“a”
键上合并,并按预期输出以下内容:
array(1) {
["a"] => array(3) {
[0] => int(1)
[1] => int(2)
[2] => int(3)
}
}
但是,对键使用整数时(即使作为字符串):
array\u merge\u recursive()
将返回:
array(2) {
[0] => array(3) {
[0] => int(1)
}
[1] => array(2) {
[0] => int(2)
[1] => int(3)
}
}
而不是人们渴望的:
array(1) {
["123"] => array(3) {
[0] => int(1)
[1] => int(2)
[2] => int(3)
}
}
想法?您可以使用短字符串作为数组键的前缀:
function addPrefix($a) {
return '_' . $a;
}
# transform keys
$array1 = array_combine(array_map('addPrefix', array_keys($array1)), $array1);
$array2 = array_combine(array_map('addPrefix', array_keys($array2)), $array2);
# call array_combine
$array = array_merge_recursive($array1, $array2);
# reverse previous operation
function stripPrefix($a) {
return substr($a, 1);
}
$array = array_combine(array_map('stripPrefix', array_keys($array)), $array)
我正在使用soulmerge的想法,通过添加字符串来转换键。然而,我的新函数只能处理2个参数,但您的情况就是这样,所以我使用了这个函数。看一看
// Adds a _ to top level keys of an array
function prefixer($array) {
$out = array();
foreach($array as $k => $v) {
$out['_' . $k] = $v;
}
return $out;
}
// Remove first character from all keys of an array
function unprefixer($array) {
$out = array();
foreach($array as $k => $v) {
$newkey = substr($k,1);
$out[$newkey] = $v;
}
return $out;
}
// Combine 2 arrays and preserve the keys
function array_merge_recursive_improved($a, $b) {
$a = prefixer($a);
$b = prefixer($b);
$out = unprefixer(array_merge_recursive($a, $b));
return $out;
}
样本数据是什么样的
// some sample data
$a = array(
'123' => array(1)
);
$b = array(
'123' => array(2, 3)
);
// what do the results say:
print_r($a);
// Array
// (
// [123] => Array
// (
// [0] => 1
// )
//
// )
print_r($b);
// Array
// (
// [123] => Array
// (
// [0] => 2
// [1] => 3
// )
//
// )
让我们尝试一下:
print_r(array_merge_recursive($a, $b));
// Array
// (
// [0] => Array
// (
// [0] => 1
// )
//
// [1] => Array
// (
// [0] => 2
// [1] => 3
// )
//
// )
print_r(array_merge_recursive_improved($a, $b));
// Array
// (
// [123] => Array
// (
// [0] => 1
// [1] => 2
// [2] => 3
// )
//
// )
如果要将键视为字符串,只需在填充时添加前缀使其成为字符串,而不是用数字填充,然后重新填充另一个数组以对其进行排序。此递归数组合并函数不会对整型键重新编号,也不会将新值附加到现有值或添加新的[key=>value]如果配对不存在,则配对。我想,埃克森肯定,这个函数就是你所需要的
function array_merge_recursive_adv(array &$array1, $array2) {
if(!empty($array2) && is_array($array2))
foreach ($array2 as $key => $value) {
if(array_key_exists($key,$array1)) {
if(is_array($value)){
array_merge_recursive_adv($array1[$key], $value);
} else {
if(!empty($array1[$key])) {
if(is_array($array1[$key])){
array_push($array1[$key], $value);
} else {
$array1[$key] = [$array1[$key]];
$array1[$key][] = $value;
}
} else if(empty($array1[$key])) {
$array1[$key] = $value;
}
}
} else {
$array1[$key] = $value;
}
}
return $array1;
}
虽然这是正确的,但感觉太做作了。为什么不是一个常规循环呢?您的
前缀器
和解释器
函数需要验证该值是否为数组!例如,在prefixer
中,如果(is_数组($v)){$out[''.$k]=prefixer($v);}或者{$out['.$k]=$v;}在循环中,则需要有。否则它工作得很好!
function array_merge_recursive_adv(array &$array1, $array2) {
if(!empty($array2) && is_array($array2))
foreach ($array2 as $key => $value) {
if(array_key_exists($key,$array1)) {
if(is_array($value)){
array_merge_recursive_adv($array1[$key], $value);
} else {
if(!empty($array1[$key])) {
if(is_array($array1[$key])){
array_push($array1[$key], $value);
} else {
$array1[$key] = [$array1[$key]];
$array1[$key][] = $value;
}
} else if(empty($array1[$key])) {
$array1[$key] = $value;
}
}
} else {
$array1[$key] = $value;
}
}
return $array1;
}