PHP递归函数没有设置嵌套数组

时间:2014-08-29 14:59:43

标签: php recursion

我有一个来自表单的变量集,并且由于原始开发人员设计不佳,表单将提交空表单元素值为''(空单引号),这会对某些查询造成严重破坏我必须写,因为函数将其视为值。我编写了一个函数来将''的任何实例设置为false,主要是因为只捕获值是否为false是不起作用的。为了深入挖掘嵌套数组,我重新编写了递归函数。

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" 
}

2 个答案:

答案 0 :(得分:2)

  1. 您正在测试而不是嵌套数组值和
  2. 你对返回值一无所知。
  3. 需要这样:

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

答案 1 :(得分:0)

您似乎正在将数组密钥传递给is_array(),这将始终评估为false。

此外,您正在更改本地$ vars变量但未使用输出:

$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;
}

哪会修改你的初始数组。