PHP array_merge_recursive函数具有空值

时间:2019-01-02 08:58:47

标签: php arrays multidimensional-array array-merge

我有两个以下数组,并使用array_merge_recursive函数,因为我有多维数组,但是当第一个数组中的一个键具有空白值并且同一键在另一个数组中具有一个数组时,则在array_merge_recursive函数之后,它添加“ 0 ”键。

例如

$a = array("id"=>"0", "test-for-draft_FirstName"=>"testtt","test-for-draft_subform1"=>"");
$b = array("test-for-draft_subform1"=>array("test-for-draft_subform10"=>array("subform-1_FileField_60"=>array("name"=>"abcd")),"test-for-draft_subform11"=>array("subform-1_FileField_60"=>array("name"=>"abcdef"))), "test-for-draft_FileFieldTest1"=>array("name"=>"test"));
$extra_jform_data = array_merge_recursive($a,$b);
echo "<pre>";print_r($extra_jform_data);

&结果是

Array
(
    [id] => 0
    [test-for-draft_FirstName] => testtt
    [test-for-draft_subform1] => Array
        (
            [0] => 
            [test-for-draft_subform10] => Array
                (
                    [subform-1_FileField_60] => Array
                        (
                            [name] => abcd
                        )
                )

            [test-for-draft_subform11] => Array
                (
                    [subform-1_FileField_60] => Array
                        (
                            [name] => abcdef
                        )
                )
        )

    [test-for-draft_FileFieldTest1] => Array
        (
            [name] => test
        )
)

因此,它为[test-for-draft_subform1]数组添加了[0]键。我不要这个还有其他PHP数组函数可以避免这种情况。

3 个答案:

答案 0 :(得分:1)

您可以使用array-filter并创建自己的函数,该函数以

的形式递归执行
function filter_rec($arr) {
    $arr = array_filter($arr);
    foreach($arr as &$elem)
        if (is_array($elem))
            $elem = filter_rec($elem);
    return $arr;
}

通过数组调用此函数

如果您只想删除空,也可以在合并之前在阵列上使用array_filter

答案 1 :(得分:0)

解决此问题(针对特定情况)的一种简单方法是遍历$a数组,并在合并之前删除所有具有空字符串的值。

foreach($a as $k => $v) {
    if($v == '') {
        unset($a[$k]);
    }   
}

Test it here

答案 2 :(得分:0)

当两个值(需要合并)之一都不是数组时,您只希望另一个值进入结果,而忽略非数组值。

没有内置函数可以执行此操作,因此您需要编写自己的函数:

function array_merge_recursive2($a, $b) {
    // If one is not an array, give precedence to the other
    if (!is_array($a)) return $b;
    if (!is_array($b)) return $a;
    $merged = [];
    foreach(array_merge($a, $b) as $k => $v) {
        $merged[$k] = !isset($a[$k]) ? $b[$k]
                      : (!isset($b[$k]) ? $a[$k]
                      : array_merge_recursive2($a[$k], $b[$k]));
    }
    return $merged;
}