【问题标题】:Using array_flip With or Without a Value使用带或不带值的 array_flip
【发布时间】:2019-01-26 00:41:28
【问题描述】:

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

在某些情况下,不处理特定的 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是一个逗号分隔的值,你不应该用explode()把它变成一个数组吗?
  • 如果$RemoveFields没有设置,第二行会尝试做array_flip(null),无效。
  • @Barmar 这只是一个长得多的函数的 sn-p,可能在这里简化了一点,但描述表明 $RemoveFields 最终是一个数组,如果它有任何值的话.至于 array_flip(null) 不起作用,这是有道理的,这就是为什么作为 $RemoveFields 没有价值的某些形式的问题,其中大多数形式仍然有效。是不是 array_flip 得到的不是 null,比如 0,如果是这样,它还会抛出错误吗?

标签: php arrays array-flip


【解决方案1】:

在原始代码中,即使未设置 $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;
}

【讨论】:

  • 是的,这基本上就是我在第二个版本中展示的内容,但主要问题是为什么当 $RemoveFields 没有值时原始代码没有错误,这是大多数形式。如果不是一组新表单在原始表单都没有抛出错误时,这个问题甚至不会出现。我应该澄清一下,这些表单是以非常规的方式创建的,第一个是使用值数组生成的,第二个(有问题的)是由相同的数组生成的,但其来源来自数据库中的表。
  • $RemoveFields 总是被设置,但除了在少数需要它的地方之外很少有任何值。无论如何,我想我对为什么突然失败有一个大致的了解,这就是最初问题的重点。谢谢。
  • 我得看看你是如何设置(或不设置)$RemoveFields。请注意,如果将变量设置为空字符串,则将其视为已设置。如果这来自表单中的文本字段,它将始终被设置。
  • 在一组表单中,是表单页面上的一个值;在另一组中,它是数据库列中的值。无论如何,它现在可以工作了。
  • 您可以考虑使用if (!empty($RemoveFields)) 而不是if(isset($RemoveFields))。这对于空字符串或数组也是错误的,而不仅仅是未设置的变量。
猜你喜欢
  • 2016-12-17
  • 2015-04-03
  • 2010-12-22
  • 2015-11-02
  • 2014-11-13
  • 2016-06-05
  • 2015-11-07
相关资源
最近更新 更多