【问题标题】:Create an array of function arguments not equal to NULL?创建一个不等于 NULL 的函数参数数组?
【发布时间】:2011-04-06 22:33:12
【问题描述】:

我将首先解释我的最终目标是什么,因为可能会有更好的解决方案。

我有一个名为updateUser 的函数,它接受以下参数:

function updateUser($password = NULL, $name = NULL, $lastname = NULL, $age = NULL, $email = NULL, $relation = NULL)

如您所见,我已将它们设置为 NULL,因此如果它们未通过函数传递,它们将变为空白。正确的? (希望我没看错)

问题是每个参数(传递的)都包含将要发送到数据库的用户的信息,我只想在查询中包含传递的变量,因为我不想设置那些没有传递到数据库中的(空白)。

于是我想到了将所有传递的参数放入一个数组中的想法。然后循环遍历数组中的每一项并生成如下字符串:

$string = "$password, $email";

【问题讨论】:

    标签: php arrays arguments


    【解决方案1】:

    我想如果你只传递一个包含应该更新的属性/值对的数组会更灵活:

    function updateUser($props) {
        $names = array('password', 'name', 'lastname', 'age', 'email', 'relation');
        $arr = array();
        for ($names as $name) {
            if (isset($props[$names])) {
                $arr = "$name = '".mysql_real_escape_string($props[$names]).'"';
            }
        }
        if (!empty($arr)) {
            $query = "UPDATE … SET ".implode(',', $arr);
        }
    }
    

    然后你用一个包含应该更新属性的数组来调用这个函数:

    updateUser(array('name'=>'User A', 'password'=>'secret'))
    

    【讨论】:

      【解决方案2】:

      使用函数 call_user_func() (php.net docs),您可以根据传递给函数的数据调用数据库 INSERT 或 UPDATE 命令。

      例如:

      function updateUser($password = NULL, $name = NULL, $lastname = NULL,
          $age = NULL, $email = NULL, $relation = NULL)
      {
          $array = array();
      
          // Create an array with indices of passed parameters:
          if($password !== NULL)  // !== to check for NULL and not empty string.
              $array["password"] = $password;
          if($name !== NULL)
              $array["name"] = $name;
          // etc...
      
          call_user_func("addToDb", $array);
      }
      
      function addToDb($detailsArray)
      {
          foreach($detailsArray as $detail)
          {
              // Add $detail's key with $detail's value to database.
          }
      }
      

      【讨论】:

      • 这是call_user_func_array() 的错误用法。 call_user_func_array() 获取第二个参数(应该是一个数组)中的每个元素并将其用作单独的参数,即call_user_func_array('foobar', array('a', 'b', 'c')); 将等同于call_user_func('foobar', 'a', 'b', 'c'); 或简单地foobar('a', 'b', 'c');(参见call_user_func())跨度>
      • 经过一番挣扎后,我终于让它工作了。当我第一次看到它时,我就像“wtf?这怎么可能?”但后来我通读了它,它变得更有逻辑了。效果很好,谢谢。
      【解决方案3】:

      获取所有参数并过滤掉不是字符串的变量。

      $arguments = func_get_args();
      array_filter($arguments, 'is_string');
      //$arguments will be an array with numeric indices
      

      【讨论】:

      • 我找到了更好的解决方案,但我会记住这一点。我在 PHP 存档中搜索了一个类似这样的功能,哈哈。感谢您的帖子!
      【解决方案4】:

      我认为问题在于您可能无法正确调用该函数。当你这样做时:

      updateUser('pass', 'user', '', '', 'user@example.com');
      

      $lastname 和 $age 的值不会为空,而是一个空字符串。但如果你这样称呼它:

      updateUser('pass', 'user', null, null, 'user@example.com');
      

      它们将保持为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2023-04-06
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        相关资源
        最近更新 更多