2014-08-29 50 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