【问题标题】:Least verbose way of defining a default array value定义默认数组值的最简洁方式
【发布时间】:2012-02-09 22:54:40
【问题描述】:

是否有更简洁的方法来检查数组值以防止 PHP 通知?目前我这样做:

$email      = (isset($_POST['user_email']))      ? $_POST['user_email']      : '';
$first_name = (isset($_POST['user_first_name'])) ? $_POST['user_first_name'] : '';
$last_name  = (isset($_POST['user_last_name']))  ? $_POST['user_last_namel'] : '';
$birthday   = (isset($_POST['user_last_name']))  ? $_POST['user_last_namel'] : '';

有没有办法像 JavaScript 那样只提供默认值,像这样?

user.email = response.email || '';

我不想隐藏通知,但是这些丑陋的检查会弄乱我的代码。我正在使用 PHP 5.2.6

【问题讨论】:

    标签: php arrays associative-array conventions ternary-operator


    【解决方案1】:

    你可以创建一个函数:

    $email      = getPost('user_email');
    $first_name = getPost('user_first_name');
    $last_name  = getPost('user_last_name');
    $birthday   = getPost('user_birthday');
    
    
    function getPost($key, $default = '')
    {
        if (isset($_POST[$key])) {
            return $_POST[$key];
        }
        return $default;
    }
    

    如果需要,将其放入函数中还可以让您更轻松地进行额外的清理,例如,trim()

    您还可以传递将返回的默认值:

    $flavor = getPost('flavor', 'vanilla'); // if $_POST['flavor'] is not set, 'vanilla' is returned
    

    【讨论】:

    • 恕我直言,这是逻辑上最不合理的做法。您反复在代码中到处散布默认设置,当您忘记在某个点更改它时,很难更改和跟踪错误。默认值应该存储在一个中心位置,就像一个包含默认值并声明为这样的数组。 (见array_mergearray_intersect_keys 方法)干,不要重复自己。
    • 没有人说你必须使用文字作为默认值。您仍然可以拥有该信息的集中位置:$flavor = getPost('flavor', Settings::get('default_flavor'));
    • @Kaii,所有这些当然都是错误的。你应该有依赖注入和自动输入验证。 如何实现并不重要。但是对于这种环境,这个解决方案将有我的偏好。如果您有很多输入参数,您的输入参数可能会很有用,但这本身就很特别。
    • @FritsvanCampen 我看不出依赖注入模式在哪里适用于此,请详细说明。 mario 的 intersect 方法包括array_filter(),如果应用正确,它对于验证非常方便。此外,当您可以轻松访问集中生成的过滤数组来检索您的值时,我认为只是开销的众多函数调用没有任何意义。我不想争论,只是我的 2 美分。
    【解决方案2】:
    function assure(&$a, $default=null) {
      if (!isset($a)) $a=$default;
      return $a;
    }
    
    $email=assure($_POST['user_email'],'');
    $first_name=assure($_POST['user_first_name'],'');
    

    【讨论】:

    • 如果未设置$_POST['user_email'] 等,则会抛出警告
    • 你确定吗?我一直使用它而没有警告。在调用中我只给出了一个引用,它不会触发警告,并且在 isset() 内部也没有警告。
    • 实际使用引用创建 $_POST['user_email'](如果它不存在)。这就是为什么你没有收到警告。为了避免警告而在 $_POST 数组中创建新元素并不是一个好习惯。
    • @webbiedave 不,它没有。我无法相信你说的话,但不确定我的假设是否错误。我在这里创建了一个简单的测试用例:codepad.viper-7.com/3Kpi2U
    • @FritsvanCampen:我说过它创建变量。我从来没有说过它被分配了一个值(它是空的)。这是怎么回事(键在函数调用之前不存在,在之后存在):codepad.viper-7.com/YPCTEi
    【解决方案3】:

    如果您有一组属性,那么一个简洁的选项是array_merge。请注意,默认值在前:

     $post = array_merge(
          array("email" => "", "first_name" => "", "last_name" => "", "birthday" => ""),
          $_POST
     );
    

    然后按原样访问它们:

     $email = $post["email"];   // it's assured there is some value
    

    将有限的变量集本地化的更紧凑的方法是将extract()array_intersect_key() 结合使用。但仅在这种组合中 - 防止导入任意变量:

     extract(array_merge($defaults, array_intersect_key(array_filter($_POST), $defaults)));
    

    【讨论】:

      【解决方案4】:

      我至少见过三种方法。

      使用默认值添加数组

      $options = $_POST + $defaults;
      

      其中$options 是一个关联数组,包含$_POST 的所有内容,但添加了来自$defaults 的键和值(除非$_POST 中有一个值用于$defaults 中的特定键,那么这个特定键$defaults 中的 /value 对被忽略,$_POST 中此特定键的值不会被替换)。

      与默认数组合并

      如@mario所示(使用array_merge()):

      $options = array_merge($defaults, $_POST);
      

      使用辅助函数...

      ...比如小花的Arr::get() helper:

      /* ... */
      public static function get($array, $key, $default = NULL)
      {
          return isset($array[$key]) ? $array[$key] : $default;
      }
      /* ... */
      

      它具有轻松替换默认值(默认为NULL)的一些优点。可以这样使用:

      echo Arr::get($_POST, 'user_email');
      

      或:

      echo Arr::get($_POST, 'user_email', 'N/A');
      

      【讨论】:

        【解决方案5】:

        您可以从NSPL 使用DefaultArray

        $post = defaultarray('', $_POST);
        
        $email = $post['user_email'];
        $first_name = $post['user_first_name'];
        $last_name = $post['user_last_name'];
        $birthday = $post['user_birthday'];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-26
          • 1970-01-01
          • 1970-01-01
          • 2014-10-24
          • 2012-11-10
          相关资源
          最近更新 更多