复制和修改数组

时间:2018-04-10 18:28:34

标签: php

我对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"}} -

5 个答案:

答案 0 :(得分:4)

您可以直接覆盖此值:

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

或只删除整个密钥:

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

答案 1 :(得分:3)

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

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

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

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

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

答案 2 :(得分:1)

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

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

然后你可以这样做:

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

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

答案 3 :(得分:1)

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

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

然后记录$body_with_password_hidden

答案 4 :(得分:0)

我构建了一个软件包来完成此操作。它很容易使用。 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。该软件包还支持深度嵌套的密钥。