【问题标题】:How can I shorten my code with isset values如何使用 isset 值缩短我的代码
【发布时间】:2016-02-18 03:53:30
【问题描述】:

我很迷茫。谁能解释我如何缩短这段代码。我有数百个这样的!我提交了一个带有输入值的表单。每当我不填写值时,我都会收到错误消息。所以我制作了这些 isset 块以防止返回错误。但我似乎效率很低!请帮忙...谢谢

if(isset($_POST['input74'])){
$value74 = $_POST['input74'];
}else{
$value74 = "";#default value
}

if(isset($_POST['input75'])){
$value75 = $_POST['input75'];
}else{
$value75 = "";#default value
}

if(isset($_POST['input76'])){
$value76 = $_POST['input76'];
}else{
$value76 = "";#default value

【问题讨论】:

  • 一个选项:$value74 = isset($_POST['input74']) ? $_POST['input74'] : "";。您可以循环并用变量替换数字。
  • 如果您发现自己像这样对输入进行编号,那么您可能应该使用数组来代替....然后您可以在 PHP 中循环遍历它,而不必显式地命名每个元素
  • 使用像@FirstOne 这样的三元运算符建议在一行上获取变量赋值。然而,你真的应该听从马克贝克的建议
  • 请使用表单中的示例更新您的问题。为您的问题提供替代方案或答案会更容易
  • 另外,了解您将如何使用来自$_POST的变量会有所帮助

标签: php unique-values


【解决方案1】:

PHP 支持表单中的数组。您可以使用索引命名表单字段,例如<input type="text" name="input[74]" ... />。然后在 PHP 中,您可以使用 forforeach 循环访问它们,因为它们将作为数组提供(即您将拥有 $_POST["input"][74])。因此,您可以编写如下内容:

$values = $_POST["input"];
for ($i = 0; $i < MAX_INPUTS; $i++) {
  if (!isset($values[$i])) {
    $values[$i] = "";  // default value
  }
}

如果由于某种原因您无法更改 HTML 端,您仍然可以使用循环来动态创建字段名称并将数据复制到 PHP 端的数组中,例如:

$value = array();
for ($i = 0; $i < MAX_INPUTS; $i++) {
  $name = sprintf("input%d", $i);
  if (isset($_POST[$name])) {
    $value[$i] = $_POST[$name];
  } else {
    $value[$i] = "";  // default
  }
}

在两种建议的解决方案中,您只有几行代码,而不是几乎相同行的数十次重复。在这两个示例中,我假设您的字段以input0 开头,并且总共有MAX_INPUTS 字段。如果不是所有字段都存在(例如,您只有 input1、intput2、input74 和 input75),您可以使用字段编号创建一个数组:

$field_list = array(1,2,74,75);

然后使用它来检查您的数据(这里是 HTML 字段名称中包含数组的示例):

$values = $_POST["input"];
foreach ($field_list as $num) {
  if (!isset($values[$num])) {
    $values[$num] = "";  // default value
  }
}

【讨论】:

  • 您的示例不起作用,因为使用名称字段会将所有内容转换为字符串。 name="input[74]" 实际上会以$_POST["input"]["74"] 出现,而​​不是$_POST["input"][74]。不仅如此,HTML 实际上支持表单中的数组,创建 php 可以破译的查询字符串。但是 Java 或 JavaScript 也可以
  • 对不起@iam-decoder:这是不正确的。整数键将是 PHP 中的整数键。
  • 确实,我刚刚尝试过......虽然字符串索引不会因为动态类型而受到伤害。
  • 奇怪,这在 IIS 服务器上会有所不同吗?因为字符串转换是不久前 SO 上一个问题的答案
  • PHP 手册中明确指出,任何指向有效整数的数组的字符串索引都将被用作此类...请参阅此答案:stackoverflow.com/a/26119646/1931985 -- @iam-decoder,您是否有与 IIS 相关的字符串转换答案的链接?我很想知道更多关于这个...
【解决方案2】:

您可以将isset 包装在这样的函数中

function myIsset(&$variable, $default = "")
{
    if(isset($variable))
    {
        return $variable;
    }
    else
    {
        return $default;
    }
}

那你就叫它$value74 = myIsset($_POST['input74']);

第二个参数默认为空字符串,因此如果您想设置默认值,您可以提供它或更改函数头中的默认值(如果它们都相同)。下面是显示代码工作的屏幕截图

虽然是的,但每个$_POST 仍然会有一行代码,至少您将 5 行代码与 1 行代码和上面的函数进行交换。您可以将其简化为一个循环,就像我在this answer 中解释的那样,但是在没有看到表单并确认任何模式的情况下,我无法为此提供任何代码示例,因为您所展示的可能只是巧合

【讨论】:

  • 改成myIsset(&amp;$variable, ...
  • @AbraCadaver 不正确。我不仅尝试了 OP 的 $_POST 变量,还尝试了这行代码 $hello = "dood"; var_dump(myIsset($hello));。注释掉$hello 行,它表明它将返回我指定的任何$default,当注释掉时,它会返回与传递的完全相同的值。添加&amp;$variable 给出了完全相同的结果
  • @Memor-X 开启错误报告,你会看到为什么你的代码不正确。而是通过引用传递变量,以避免未定义的变量警告,这实际上是首先使用 isset 的重点。在isset手册页php.net/manual/en/function.isset.php#95557的cmets部分有这个函数的版本@
  • @rjdown 啊,这可能就是原因。我倾向于关闭那些
  • @downvoter 如果您的反对意见是关于我最初拥有$variable 而不是&amp;$variable 的方式,那么您可以删除您的反对意见,因为该问题已得到修复。否则请解释什么是错的
【解决方案3】:

使用三元组来缩短代码:

$value74 = isset($_POST['input74']) ? $_POST['input74'] : 'Default value';
$value75 = isset($_POST['input75']) ? $_POST['input75'] : 'Default value';
$value76 = isset($_POST['input76']) ? $_POST['input76'] : 'Default value';

或者您也可以遍历 $_POST 数组,但必须进行一些过滤/验证。快速的想法:

if(!empty($_POST)) {
    $i = 0;
    $arr = array();
    foreach($_POST as $input) {
        $arr[$i] = $input;
        $i++;
    }
}

$arr 然后会生成一个类似

的数组
Array
(
    [74] => 'value74'
    [75] => 'value75'
    [76] => 'value76'
)

【讨论】:

    【解决方案4】:

    你可以使用array_merge

    您将使用提供的所有默认输入值设置默认数组。

    $aryDefault = ['input74'=>'', 'input75'=>'',...]
    

    然后将 array_merge 与您的 post 数组一起使用,它将填充所有缺失的值。注意:订单很重要check out the docs

    如果输入数组有相同的字符串键,那么后面的值 因为该键将覆盖前一个键。但是,如果数组 包含数字键,后面的值不会覆盖原来的 值,但会被附加。

    使用array_merge($aryDefault, $_POST) 以便$_POST 覆盖默认值。

    此外,您可以使用可变变量,这样您就可以在循环中执行此操作。如果您的所有变量都以您的数组键命名,就像在您的示例中一样。

    完整代码:

    $aryDefault = ['input74'=>'', 'input75'=>'',...];
    $aryFinal = array_merge($aryDefaults, $_POST);
    foreach( $aryFinal as $key=>$value){
      $$key = $value;
    }
    

    如果 $aryDefault 超级大,您甚至可以生成带有循环的 $aryDefault。

    $aryDefault = array();
    for(i=0;i<=100;i++){
      $aryDefault["input$i"] = "";
    }
    

    【讨论】:

      【解决方案5】:

      如果我理解你正确地看到你想将一个变量设置为发布或默认值,你可以按照下面的结构来做:

      $variable = isset($_POST['name']) ? $_POST['name] : "defaultvalue";
      

      那将设置它存在的变量,否则设置指定的默认值。我希望这会有所帮助。

      【讨论】:

        【解决方案6】:

        您可以创建一个简单的函数来封装 PHP 7 之前的代码:

        function post($key, $default = null){
            return isset ($_POST[$key])?$_POST[$key]:$default;
        }
        

        自 PHP 7 起(使用null coalescing operator (??)):

        function post($key, $default = null){
            return $_POST[$key] ?? $default;
        }
        

        或更好的功能只是简单(如上所述)

        $value74 = $_POST['input74'] ?? ''; #default value
        $value75 = $_POST['input75'] ?? ''; #default value
        $value76 = $_POST['input76'] ?? ''; #default value
        

        【讨论】:

          【解决方案7】:

          PHP 7 有一个新的运算符来解决这种特定情况:null coalesce operator (??) 替换了这个:

          $foo = isset($foo) ? $foo : $bar
          

          有了这个:

          $foo = $foo ?? $bar;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-25
            • 2013-05-04
            • 2020-03-08
            • 1970-01-01
            相关资源
            最近更新 更多