【问题标题】:PHP check if array values are setPHP检查是否设置了数组值
【发布时间】:2011-05-27 00:03:50
【问题描述】:

我有以下功能:

public function insertMember($username, $password, $fname, $lname)
    {
        $param              = array();
        $param['username']  = $username;
        $param['password']  = $password;
        $param['fname']     = $fname;
        $param['lname']     = $lname;
        return (count(array_filter($param, 'strlen')) == 0) ? FALSE : $this->insertIntoDB($param);
    }

使用(count(array_filter($param, 'strlen')) == 0) 是否是检查所有变量$username, $password, $fname, $lname 是否已传递给函数的正确/最佳方式?

谢谢,
帕夫

【问题讨论】:

  • 你的参数列表没有任何默认值,所以为了调用这个函数,无论如何你必须提供4个参数。另一方面,数据验证仍然很重要。
  • @Chris 好吧,它所要做的就是发出警告,您仍然不必强制传递所有 4 个参数。
  • @deceze Bah,这只是一个警告?愚蠢的PHP。

标签: php arrays function


【解决方案1】:
if(count(array_filter($array)) == 0)
//   all values are empty 

【讨论】:

  • 你应该扩展你的答案来解释这如何满足问题,并提供一个更相关的例子来说明如何在问题的上下文中使用它。
  • 这里是这个答案的一个例子:
【解决方案2】:

您无法真正检查变量是否已传递给函数,您只能检查它们的值。如果值为falsey,你可以拒绝它。这并不一定意味着该变量没有被传递,只是该值是 falsey

if (!$username || !$password || !$fname || !$lname)

要对其进行更多限制并接受例如空字符串和 0 作为有效值,请执行以下操作:

public function insertMember($username = null, $password = null, $fname = null, $lname = null) {
    if ($username === null || $password === null || $fname === null || $lname === null)

最好的方法可能是接受一个数组,您可以显式测试它是否存在键,而不管它们的值如何:

public function insertMember($values) {
    if (array_diff_key(array_flip(array('username', 'password', 'fname', 'lname')), $values)) {
        // not all keys were set!
    }

不管怎样,这个:

$param             = array();
$param['username'] = $username;
$param['password'] = $password;
$param['fname']    = $fname;
$param['lname']    = $lname;

可以简写为:

$params = compact('username', 'password', 'fname', 'lname');

【讨论】:

    【解决方案3】:

    也许是对的,但不是最好的。
    如果需要检查所有变量:

    if (empty($username) || empty($password) || empty($fname) || empty($lname)) return false;
    

    【讨论】:

    • 我有许多类似的函数,需要检查值是否已通过/设置。所以我真的不想自己检查每个变量,宁愿将它们分配给一个数组并像我的帖子一样进行检查。只是想知道这是否是最好的方法?还是有另一种方法(不检查每个变量)?
    • 这更像是最糟糕的方式。你要不要 - 这不是一个问题。如果你必须检查 - 你会检查。每个变量。
    • 这正是 array_filter 所做的,但你选择了肮脏的方式来做到这一点。
    【解决方案4】:

    您可以省略'strlen' 参数,array_filter 的默认行为在这种情况下可以正常工作。这样代码就短了一点。

    但是,作为风格问题,您可能需要考虑显式

    if (empty($username) || empty($password) || ...)
    

    因为它更容易向读者传达函数对参数的要求。

    【讨论】:

      【解决方案5】:

      为什么不早点结账呢?让它变成这样:

      public function insertMember($username, $password, $fname, $lname) {
          if (!$username || !$password || !$fname || !lname) {
              return false;
          } else {
              $param = array();
              $param['username'] = $username;
              $param['password'] = $password;
              $param['fname'] = $fname;
              $param['lname'] = $lname;
              return $this->insertIntoDB($param);
          }
      }
      

      【讨论】:

        【解决方案6】:

        这不会检查数据的有效性,但是:

        // Do something if 4 (all) arguments were passed in
        if(func_num_args() == 4) {
        }
        

        【讨论】:

          【解决方案7】:

          我不喜欢使用array_filter,因为按名称传递函数感觉有点脏。虽然如果你使用 stdlib 函数可能没问题。

          我会使用循环

          foreach ($param as $v) {
              if (empty($v)) return false;
          }
          

          【讨论】:

            猜你喜欢
            • 2011-07-24
            • 2013-10-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-28
            • 1970-01-01
            • 2012-03-10
            • 2017-10-25
            相关资源
            最近更新 更多