【问题标题】:Assignation does't take effect inside two-dimension array [duplicate]赋值在二维数组中不起作用[重复]
【发布时间】:2019-12-17 17:58:41
【问题描述】:

我有一个按照这种模式充满凭据的数组:

Array (
    [0] : Array (
        "login" => "toto"
        "passwd" => "mdpsecrethashe"
    )
    [1] : Array (
        "login" => "titi"
        "passwd" => "supermdp"
    )
    [2] : Array (
        [...]
    )
    [...]
)

我想通过登录和更改密码获得所需的凭据。这是我的尝试:

function getListWithModifiedPassword($credentials_list, $wanted_login, $new_password){
    echo(print_r($credentials_list, TRUE));
    foreach ($credentials_list as $credentials)
        if ($credentials['login'] === $wanted_login)
            $credentials['passwd'] = hash('whirlpool', $new_password);
    echo(print_r($credentials_list, TRUE));
    return $credentials_list;
}

第 5 行的分配不希望工作任何值(两个 echo(print_r($credentials_list, TRUE)); 之间没有变化,即使第 4 行的条件为真(测试:如果我用 echo "Hello world\n"; 替换第 5 行,它可以工作) .

这里发生了什么?

【问题讨论】:

    标签: php multidimensional-array


    【解决方案1】:

    在 PHP 的 foreach 循环中,您正在处理数组的副本。因此,您对$credentials['passwd'] 的分配对$credentials_list 无效。

    你有两个选择:

    1. 传递给 foreach 参考值(注意 & 在 foreach 括号中的 $credentials 之前以及 unset 函数,它会在 foreach 之后停止对变量的意外分配 - see docs):
    foreach($credentials_list as &$credentials) {
        if ($credentials['login'] === $wanted_login)
                $credentials['passwd'] = hash('whirlpool', $new_password);
    }
    unset($credentials);
    
    1. 直接赋值给原始数组:
    foreach($credentials_list as $key => $credentials) {
        if ($credentials['login'] === $wanted_login)
            $credentials_list[$key]['passwd'] = hash('whirlpool', $new_password);
    }
    

    祝你有美好的一天! :)

    【讨论】:

      【解决方案2】:

      改为这样打印

      var_dump($credentials_list);
      

      如果您要返回值,则无需 print_r 或 echo

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 1970-01-01
        • 2017-01-29
        • 2019-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多