Php 复制和修改数组

Php 复制和修改数组,php,Php,我对PHP没有经验,必须用以下代码修改密码: $body=array( 'userInfo' => array( 'userName' => $username, 'password' => $password, 'applicationKey' => $appKey, ), ); 变量$body用于应用程序逻辑和记录阵列: $this->log

我对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\u,隐藏密码\u
,但我想学习一些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"}} -
所需的日志语句:

[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"}} -

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

$body=array(
        'userInfo' => array(
            'userName' => $username,
            'password' => $password,
            'applicationKey' => $appKey,
        ),
    );
然后你可以做:

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

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

您可以直接覆盖此值:

$body['userInfo']['password'] = null;
或者只需移除一整把钥匙:

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

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

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

然后使用隐藏的密码记录
$body\u

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

$redacted = ['userInfo' => ['password' => '********']];
然后在记录原始数据时,使用
array\u replace\u recursive
覆盖原始数据中的值

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

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

我构建了一个包来完成这项工作。它很容易使用


您可以通过在第二个构造函数参数中提供任意数组键来编校它。在上面的例子中,我们只是编辑
密码
。该包还支持深度嵌套密钥。

与您所说的相同-克隆值并删除密钥。$body['userInfo']['password']='';应该做的技巧。可能重复的阅读。您的问题的答案可在上找到。密钥仍将设置为
password
,但值将为Null,这很好,根据OP所需的输出语法:)谢谢。这正是我希望学习的技巧。您需要复制阵列,或者只在使用业务逻辑中的密码后进行日志记录,因此我倾向于使用其他解决方案。但还是要谢谢你。