2014-02-27 65 views
1

我有兩個數組,第一個是從函數獲得的結果,第二個包含默認值。我想用第二個數組中的值替換第一個數組中的空值。用默認值替換數組中的空值

$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

從功能爲什麼要退空?如果你知道你將要進行數組比較,那麼使用array_push會更有意義嗎? – iamthereplicant

+0

您應該再次重構您的函數(登錄) –

+0

@iamthereplicant,因爲我的$ result數組必須與'$ defaults'具有相同的形式,而空值更易於拼接。 'array_push'在數組的末尾添加一個元素,不是?我會嘗試的。 – guest459473

回答

-2
<?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

+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);