【问题标题】:Copy and modify array复制和修改数组
【发布时间】:2018-09-20 11:42:08
【问题描述】:

我对 PHP 没有经验,必须在以下代码中修改密码:

    $body=array(
        'userInfo' => array(
            'userName' => $username,
            'password' => $password,
            'applicationKey' => $appKey,
        ),
    );

变量$body既用于应用程序逻辑,也用于记录数组:

$this->logger->debug("REQUEST: URL[{$this->config->endpoint}] BODY: " . json_encode($body));

但我不应该记录密码。我想修改它。

我知道我可以将数组复制并粘贴到一个新变量 $body_with_password_hidden,但我想学习一些 PHP 习语,更不用说尽可能使代码库尽可能紧凑。

有什么优雅的方法可以做到这一点?用我更舒服的语言,我会克隆字典,并覆盖敏感值。我将如何在 PHP 中做到这一点?

更多信息

当前日志语句:

[2018-04-10T18:23:11+00:00] [DEBUG] REQUEST: URL[http://myservice.com/myendpoint/login] BODY: {"userInfo":{"userName":"Administrator","password":"Administrator","applicationKey":"abc123"}} -

所需的日志语句:

[2018-04-10T18:23:11+00:00] [DEBUG] REQUEST: URL[http://myservice.com/myendpoint/login] BODY: {"userInfo":{"userName":"Administrator","password":"********","applicationKey":"abc123"}} -

【问题讨论】:

标签: php


【解决方案1】:

我构建了一个包来做这件事。它很容易使用。 https://github.com/mtownsend5512/array-redactor

$body = (new \Mtownsend\ArrayRedactor\ArrayRedactor(array(
    'userInfo' => array(
        'userName' => $username,
        'password' => $password,
        'applicationKey' => $appKey,
    ),
), ['password']))->redact();

$this->logger->debug("REQUEST: URL[{$this->config->endpoint}] BODY: " . json_encode($body));

您可以通过在第二个构造函数参数中提供任何您希望的数组键来编辑它。在上面的示例中,我们仅编辑 password。该软件包还支持深度嵌套的键。

【讨论】:

    【解决方案2】:

    您可以创建一个与您的数据结构相匹配的模板,并使用所需的密文符号作为相应键的值。

    $redacted = ['userInfo' => ['password' => '********']];
    

    然后在记录时使用array_replace_recursive覆盖原始数据中的值。

    $this->logger->debug(
        "REQUEST: URL[{$this->config->endpoint}] BODY: "
        . json_encode(array_replace_recursive($body, $redacted))
    );
    

    这对于覆盖单个值可能有点矫枉过正,但如果您有一个更复杂的结构需要替换更多值,这可能是一种更简洁的方法。

    【讨论】:

    • 谢谢。这就是我希望学习的巧妙技巧。
    【解决方案3】:

    我认为最短的方法是复制数组,并使用修改后的password 值记录它。

    $body_with_password_hidden = $body;
    $body_with_password_hidden['userInfo']['password'] = "********";
    

    然后登录$body_with_password_hidden

    【讨论】:

      【解决方案4】:

      您可以根据键的名称将一个值弹出到数组中。所以你有以下内容:

      $body=array(
              'userInfo' => array(
                  'userName' => $username,
                  'password' => $password,
                  'applicationKey' => $appKey,
              ),
          );
      

      你可以这样做:

      $body['userInfo']['password'] = null;
      

      这会将 userInfo 中的键设置为空值。

      【讨论】:

      • 密钥仍将设置为password,但值为空
      • 这很好,根据 OP 所需的输出语法:)
      【解决方案5】:

      你可以直接覆盖这个值:

      $body['userInfo']['password'] = null;
      

      或者只是删除整个密钥:

      unset($body['userInfo']['password']);
      

      【讨论】:

      • 您需要复制数组,或者仅在业务逻辑中使用密码后进行日志记录,因此我更喜欢其他解决方案。但是还是谢谢你。
      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多