PHP使用数组或提取变量?

时间:2014-02-06 13:03:04

标签: php

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

然而,这意味着必须引用最终数组,当向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'];

?>

2 个答案:

答案 0 :(得分:0)

要指出你的问题而不要分歧我想评论的其他事情:

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

答案 1 :(得分:0)

您不需要提取$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);