我有两个数组,第一个是我从函数得到的结果,第二个是默认值。我想用第二个数组中的值替换第一个数组中的空值。
$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];
...对于数组中的每个键?我想保留两个数组中为空的空值。此刻这是我找到的唯一解决方案,但它不是很优雅......
如何获得预期结果?我没有任何想法。
答案 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);