Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP';整数键上的s数组\合并\递归行为_Php_Arrays_Multidimensional Array - Fatal编程技术网

PHP';整数键上的s数组\合并\递归行为

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”键上合并,并按预期输出以下内

是否有一种递归合并数组的方法,与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(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;
    }