使用 array_flip 有或没有值

Using array_flip With or Without a Value

用于处理表单 $_POST 提交的代码在大多数表单上运行良好,但在一组新表单上突然崩溃。我看不出表格本身有任何区别,因为它完全基于 posted 值,我已经修复了它,但我很好奇为什么突然出现问题。

在某些情况下,特定的 post 值不会被处理,当不需要时,这些值在 $RemoveFields 中作为逗号分隔的列表被转换为数组并在一组表单,$RemoveFields 是否有任何值并不重要,但在另一组表单中,它在为空时崩溃。

通过添加一个条件,我能够让它工作,但是谁能告诉我原始代码的问题是什么?旧的和新的都在下面。第一个仅适用于部分表格,而第二个似乎适用于所有表格。

原代码:

// Remove unneeded fields specified in $RemoveFields variable
if (isset($RemoveFields) && !is_array($RemoveFields)) $RemoveFields = array($RemoveFields);
$filteredarray = array_diff_key($_POST, array_flip($RemoveFields));

相同的代码,但带有 $filteredarray 值的条件:

// Remove unneeded fields specified in $RemoveFields variable
if (isset($RemoveFields) && !is_array($RemoveFields)) $RemoveFields = array($RemoveFields);
$filteredarray = (isset($RemoveFields)) ? array_diff_key($_POST, array_flip($RemoveFields)) : $_POST;

在原始代码中,即使未设置 $RemoveFields,您也会调用 array_flip($RemoveFields)。这失败了,因为 array_flip() 的参数必须是一个数组。

您应该使用 isset() 来保护两行代码:

if (isset($RemoveFields)) {
    if (!is_array($RemoveFields)) {
        $RemoveFields = array($RemoveFields);
    }
    $filteredarray = array_diff_key($_POST, array_flip($RemoveFields));
} else {
    $filteredarray = $_POST;
}