2014-08-29 73 views
0

我有一個變量集從一個表單進來,由於原始開發人員的糟糕設計,表單將提交空的表單元素值爲''(空單引號),這嘔吐我不得不寫一些查詢,因爲函數將這些查詢看作是值。我寫了一個函數來設置''的任何實例爲false,主要是因爲只是捕獲值爲false是行不通的。我重新編寫函數以遞歸以深入到嵌套數組。PHP的遞歸函數沒有設置嵌套數組

function validateVars($vars){ 
    foreach($vars as $k => $v){ 
     is_array($k) ? validateVars($k) : $vars[$k] = ($v == '' ? FALSE : $v); 
    } 
    return $vars; 
} 

的問題是,它集各項指標與「」的值設置爲false,因爲它應該,但它實際上並沒有進入陣列設置它們的值。下面是一個示例轉儲:

array(14) { 
    ["title"]=> string(3) "JLR" 
    ["issue"]=> array(3) { 
     ["jobs"]=> string(11) "66055,66056" 
     ["Ids"]=> string(0) "" 
     ["DateRange"]=> string(0) "" } 
    ["article"]=> array(2) { 
     ["Jobs"]=> string(0) "" 
     ["Ids"]=> string(0) "" } 
    ["issueDateFields"]=> string(11) "DateCreated" 
    ["articleDateRange"]=> bool(false) 
    ["articleDateFields"]=> string(11) "DateCreated" 
    ["AdsJobs"]=> bool(false) 
    ["FMBMJobs"]=> bool(false) 
    ["AdsIds"]=> bool(false) 
    ["FMBMIds"]=> bool(false) 
    ["adsDateRange"]=> bool(false) 
    ["adsDateFields"]=> string(11) "DateCreated" 
    ["fmbmDateRange"]=> bool(false) 
    ["fmbmssueDateFields"]=> string(11) "DateCreated" 
} 
+0

這一行是一個很酷的。 – 2014-08-29 15:03:11

回答

2
  1. 你正在測試的關鍵而不是嵌套的數組值,以及
  2. 你正在做什麼用的返回值。

它需要是這樣的:

function validateVars(array $vars){ 
    foreach ($vars as &$value) { 
     if (is_array($value)) { 
      $value = validateVars($value); 
     } else if ($value == '') { 
      $value = false; 
     } 
    } 
    return $vars; 
} 

如果你喜歡的俏皮話,至少做正確。 ;)

function validateVars(array $vars) { 
    return array_map(
     function ($v) { 
      return is_array($v) ? validateVars($v) : ($v == '' ? false : $v); 
     }, 
     $vars 
    ); 
} 
+0

完美,謝謝!不能相信我錯過了這一點。 – VikingBlooded 2014-08-29 15:09:23

+0

不幸的是,我必須非常小心地執行這些事情,一旦我完成了,這將由PHP和DB引擎比我更少知識的人維護。所以,它必須是他們可以圍繞的東西。 – VikingBlooded 2014-08-29 15:13:41

+1

@VikingBlooded - 然後遠離三元組(特別是嵌入三元組)。第一種形式是*更多,更可讀*。 – 2014-08-29 15:15:28

0

好像你傳遞數組鍵進入is_array()將總是爲false。

此外,你改變了當地$瓦爾變量,但沒有使用的輸出:

$vars = [];//this is your array 

$vars = validateVars($vars); 

function validateVars($myVars){ 
    foreach($myVars as $k => $v){ 
     is_array($v) ? $myVars[$k] = validateVars($v) : $myVars[$k] = ($v == '' ? FALSE : $v); 
    } 
    return $myVars; 
} 

將要修改您最初的陣列。

+0

不幸的是,沒有工作。 – VikingBlooded 2014-08-29 15:10:09

+0

對不起,我編輯了一下以包含函數調用。我沒有測試過這個,但是我的答案與deceze的類似 – Joao 2014-08-29 15:11:14

+0

如果不在函數中使用'global'關鍵字導入,那麼不能使用這樣的變量,並且全局變量非常不鼓勵,特別是對於像這樣的東西。 – 2014-08-29 15:16:47