【问题标题】:PHP use array or extract to variables?PHP使用数组还是提取到变量?
【发布时间】:2014-02-06 13:03:04
【问题描述】:

这是一个风格多于功能的问题。目前,我使用以下代码生成一个数组,这些值在函数中经过了各种正则表达式。

然而,这意味着必须引用最终数组,当向 SQL 查询添加大量值时,与直接变量相比,该数组开始看起来相当混乱。

我可以在调用函数后将数组提取到变量中,但我想知道是否有某种方法可以在函数内部执行此操作并且不会遇到范围问题,或者我应该避免使用直接变量并坚持使用数组?

<?php

function formData($form_vars)
{
    $regex_array = array(
        'alpha_num' => "/[^a-zA-Z0-9[:space:][:blank:]]/",
        'basic'     => "/[^a-zA-Z0-9[:space:][:blank:],.\\'()&-]/"
    );

    foreach ($form_vars as $key => $var) {
        $regex = $regex_array[$var];
        $val = preg_replace($regex, '',  $_REQUEST[$key]);
        $vars[$key] = $val;
    }

    return $vars;
}

$vars = array(
    'address_one'   => "basic", 
    'address_two'   => "basic", 
    'address_three' => "basic", 
    'postal'        => "alpha_num"
);

$vars = formData($vars); 

echo $vars['address_one'];

?>

【问题讨论】:

    标签: php


    【解决方案1】:

    就您的问题提出观点,而不是在我想评论的其他事情上产生分歧:

    $regex_array(我称之为$softTypeFilters)和$vars(我称之为$fieldSoftTypes)现在可以外化为一个配置文件。所以我会坚持这一点,而不是使用你的其他建议。您可能会失去这个非常强大的功能(可配置性)。而且代码还是很容易阅读的。

    【讨论】:

    • $vars 会在每次使用不同的表单时发生变化,因此无法进入配置文件。
    • 也为表单命名,并使用该名称(或 URL?)从该两级数组中获取软类型:&lt;form-name&gt;.&lt;field.name&gt;
    • 这个网站的表格太多,会创建一个非常繁琐的文件
    • 好吧,我停止了 :) 但是您拥有的数据越多,您就越需要对其进行结构化,并且以这种方式将其集中可能简化以后的变更管理。但它也可能不必要地使您的代码复杂化。
    【解决方案2】:

    您不需要提取 $vars 并可以使用它来更轻松地构建您的查询(例如,使用 function build_query($var),使用其他循环)

    编辑详细回答:我想到这样的事情:

    <?php
    
    
    function formData($vars, $alias)
    {
      foreach($_POST as $k => $v)
      {
        // skip unknown fields
        if (!isset($vars[$k]))
          continue;
        // deal with input names != field name
        $field_name = isset($form_alias[$k])?$form_alias[$k]:$k;
    
        $vars[$key] = preg_replace($regex, '',  $_REQUEST[$key]);
        if (function_exists('preprocess_'.$key))
          $vars[$key] = call_user_func('preprocess_'.$key, $vars[$key]);
      }
      return $vars;
    }
    
    function buildQuery($vars)
    {
      $sql = '';
      // use a query builder, PDO prepared statements or anything 
      foreach($vars as $field => $value)
      {
        // ...
      }
      return $sql;
    }
    
    $vars = array(
      'address_one'   => "basic", 
      'address_two'   => "basic", 
      'address_three' => "basic", 
      'postal'        => "alpha_num",
    );
    $form_alias = array(
      'address1'   => "address_one", 
      'address2'   => "address_two", 
      'address3'   => "address_three",
    );
    
    $vars = formData($vars, $form_alias);
    
    $query = buildQuery($vars);
    

    【讨论】:

    • 只有当 db 字段名称都与数组键相关时才如此,我还需要做一些预处理,这样直接变量会更容易阅读。
    • 更好的解决方案是使用 php 类、对象模型和方法来验证和格式化数据
    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 2011-01-14
    • 2017-12-27
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多