【问题标题】:array key values being emptied/zero'd immediately after being assigned分配后立即清空/归零的数组键值
【发布时间】:2017-09-26 12:09:12
【问题描述】:

我有一个使用 PHP 设置页面输入字段值的表单,例如:

// create and fill inputVarsArr with keys that have empty vals
$troubleInsertInputVarsArr = array_fill_keys(array('status', 'discoverDate', 'resolveDate', 'ticketIssued', 'eqptSystem', 'alarmCode', 'troubleDescription', 'troubleshootingSteps', 'resolveActivities', 'notes'), '');

if (isset ($_POST['insert'])) { // update DB site details 
    foreach ($troubleInsertInputVarsArr as $key => $val) {
        if ($key !== 'discoverDate' && $key !== 'resolveDate') { //deal with dates separately below
            $val = $_SESSION[$key] = sanitizeText($_POST[$key]);
            echo '<br>(' . __LINE__ . ') ' . $key . ': ' . $val . ' ';
        } // close IF ; line 47 echo
    } // close FOREACH

    foreach ($troubleInsertInputVarsArr as $key => $val) {
        echo '<br>(' . __LINE__ . ') ' . $key . ': ' . $val . ' ';
    } // close FOREACH // line 52 echo
}

if 条件下嵌套在foreach 循环中的输入变量回显(第47 行的回显)按我的预期打印出来(输入到表单页面的输入字段中的值):

(47) status: Outstanding
(47) ticketIssued: no
(47) eqptSystem: Tower Lights
(47) alarmCode: Visual
(47) troubleDescription: - no description yet -
(47) troubleshootingSteps: - no steps yet taken -
(47) resolveActivities: - no activities yet decided -
(47) notes: - no notes -

但随后相同数组中的相同 key-val 对在紧随其后的 foreach 循环中回显(在第 52 行回显),没有发生任何进一步的变量处理, 打印出每个键的空值:

(52) status:
(52) discoverDate:
(52) resolveDate:
(52) ticketIssued:
(52) eqptSystem:
(52) alarmCode:
(52) troubleDescription:
(52) troubleshootingSteps:
(52) resolveActivities:
(52) notes: 

不知何故,数组的键值在分配后立即被清零,我不知道如何或为什么。任何人都可以看到可能发生这种情况的明显原因吗?

【问题讨论】:

  • 伙计,你用空值 '' 创建了 $troubleInsertInputVarsArr,你期待什么?

标签: php


【解决方案1】:

您永远不会为 $troubleInsertInputVarsArr 分配值,只有键。 你可以试试这个:

   foreach ( $troubleInsertInputVarsArr as $key => $val ) {
      $troubleInsertInputVarsArr[$key] = sanitizeText( $_POST[ $key ]); 
      if ( $key !== 'discoverDate' && $key !== 'resolveDate' ) { 
          $val = $_SESSION[ $key ] = sanitizeText( $_POST[ $key ] );
          echo '<br>(' . __LINE__ . ') ' . $key . ': ' . $val . ' ';
      } 
    }

【讨论】:

  • 我发现这比通过引用分配东西更可取。
  • 阅读我对其他答案的评论 :-)
  • @delboy1978uk 为什么你更喜欢使用参考?
  • 我不喜欢多重作业,我给你那个
  • 除了错误修复之外,您实际上已经改变了原始代码的行为。我不认为他想要数组中的日期值(根据他的第一个“预期”输出示例)
【解决方案2】:

$val = $_SESSION[ $key ] = sanitizeText( $_POST[ $key ] ); 行不会更改 $troubleInsertInputVarsArr 数组,因为 $val 是数组元素值的副本,而不是引用。

更改 foreach 以使 $val 成为引用。

foreach ( $troubleInsertInputVarsArr as $key => &$val ) {

【讨论】:

  • 没错,直到涉及到第一个 foreach discoverDate, resolveDate 中的 2 个跳过字段。 OP 代码中的有线内容 ;-)
  • @JustOnUnderMillions 这是一个单独的问题
  • 当我看到 OP 代码时,只是修复它会有所帮助,但不会教任何东西 :-) 无论如何,这只是一个注释。
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2019-04-04
相关资源
最近更新 更多