使用默认值替换数组中的空值

时间:2014-02-27 15:20:15

标签: php arrays replace split

我有两个数组,第一个是我从函数得到的结果,第二个是默认值。我想用第二个数组中的值替换第一个数组中的空值。

$result = [
    'NOTNULL',
    null,
    null,
    null,
    null
];

$defaults = [
    'default1',
    'default2',
    [
        null,
        null,
        null
    ]
];

# transforming $result array (to have the same form as $defaults array)
array_splice($result, 2, 3, [array_slice($result, 2)]);

$result = array_replace_recursive(
    $default,
    $result
);

输出:

Array (
    [0] => NOTNULL
    [1] => null
    [2] => Array (
        [0] => Array ()
        [1] => null
        [2] => null
     )
)

预期:

Array (
    [0] => NOTNULL
    [1] => default2
    [2] => Array (
        [0] => null
        [1] => null
        [2] => null
    )
);

我知道我得到了这个结果,因为array_replace_recursive递归地将传递的数组中的元素替换为第一个数组,但是如何只更改非空的值呢?

也许我应该做这样的事情?

$result[0] = (array_key_exists(0, $result) || $result[0] === null) ? $defaults[0] : $result[0];

...对于数组中的每个键?我想保留两个数组中为空的空值。此刻这是我找到的唯一解决方案,但它不是很优雅......

如何获得预期结果?我没有任何想法。

2 个答案:

答案 0 :(得分:0)

<?php
$result = array(
    'NOTNULL',
    null,
    null,
    array(null, null),
    null
);

$defaults = array(
    'default1',
    'default2',
    array(
        null,
        null,
        null
    ),
    array('tea', 'biscuit')
);


function myRecursiveArrayMerge($result, $defaults){
        foreach ($result as $index => $value) {
                if(is_array($value))
                        $result[$index] = myRecursiveArrayMerge($value, $defaults[$index]);

                if ($value === null && isset($defaults[$index]))
                        $result[$index] = $defaults[$index];
        }

        return $result;

}
$finalResult = myRecursiveArrayMerge($result, $defaults);

print_r($finalResult);

答案 1 :(得分:-1)

<?php

$result = array(
    'NOTNULL',
    null,
    null,
    null,
    null
);

$defaults = array(
    'default1',
    'default2',
    array(
        null,
        null,
        null
    )
);

echo "Before\n";
var_dump($result);

foreach ($result as $index => $value) {
    if ($value === null && isset($defaults[$index]))
        $result[$index] = $defaults[$index];
}   

echo "After\n";
var_dump($result);

http://ideone.com/4HMGH4