使用PHP将数组插入文件的正确方法是什么?

时间:2019-04-04 13:18:16

标签: php

我正在尝试在发布后将用户“最喜欢”的游戏放入其用户的相应文件中。

if(isset($_POST['favourite'])){

        $filetxt = 'data/users.json';

        $formdata = $_POST['favourite']; //this contains the value "game"

        $arr_data = array();

        if(file_exists($filetxt)) {
            $jsondata = file_get_contents($filetxt);
            $arr_data = json_decode($jsondata, true);
        }

        $arr_data[][$_SESSION['username']]['favourite'] = $formdata;

        $jsondata = json_encode($arr_data, JSON_PRETTY_PRINT);
        file_put_contents('data/users.json', $jsondata);
}

文件的结构为:

[
    {
        "CNR": {
            "first-name": "test",
            "last-name": "test",
            "email": "test",
            "country": "test",
            "password": "test",
            "favourite": []
        }
    },
    {
        "usertest": {
            "first-name": "test",
            "last-name": "test",
            "email": "test",
            "country": "United States",
            "password": "password",
            "favourite": []
        }
    }
]

当前,它将将正确的数据添加到数组中,而不是添加到数组中。

[
    {
        "CNR": {
            "first-name": "test",
            "last-name": "test",
            "email": "test",
            "country": "test",
            "password": "test",
            "favourite": []
        }
    },
    {
        "usertest": {
            "first-name": "test",
            "last-name": "test",
            "email": "test",
            "country": "United States",
            "password": "password",
            "favourite": []
        }
    },
    {
        "CNR": {
            "favourite": "game"
        }
    }
]

我已经尝试过诸如arraypush,splice和其他方法之类的东西,但是我不确定哪种用例是最好的。 非常感谢我对如何最好地达到预期效果的任何想法/建议,谢谢!

4 个答案:

答案 0 :(得分:1)

$arr_data[$_SESSION['username']]['favourite'][] = $formdata;

区别在于我将[]移到了$arr_data的末尾。

答案 1 :(得分:1)

在将其添加到数组之前,您需要检查键是否存在,然后继续操作而不是仅添加代码。

if(isset($_POST['favourite'])){

        $filetxt = 'data/users.json';

        $formdata = $_POST['favourite']; //this contains the value "game"

        $arr_data = array();

        if(file_exists($filetxt)) {
            $jsondata = file_get_contents($filetxt);
            $arr_data = json_decode($jsondata, true);
        }
 // changes over here
        if(isset($arr_data[$_SESSION['username']])){
            if(isset($arr_data[$_SESSION['username']]['favourite'])){
               $arr_data[$_SESSION['username']]['favourite'][] = $formdata;
            }  else {
               $arr_data[$_SESSION['username']]['favourite'] = $formdata;
            }

        } else {
          $arr_data[][$_SESSION['username']]['favourite'] = $formdata;
        }

        $jsondata = json_encode($arr_data, JSON_PRETTY_PRINT);
        file_put_contents('data/users.json', $jsondata);
}

答案 2 :(得分:0)

我可以看到大多数人都回答了这个问题,但是我是否也可以就您的过程提供一些建议(值得深思)?

1)。首先,如果您将所有用户存储在一个文件中,或者每个用户有一个文件,我将无法解决。示例 username.json 我将假设每个用户名都有一个文件,因为应该更快地写入文件,并且仅由于一个用户正在写入该文件,这要求其他人将主文件锁定。

2)。我注意到,喜欢的部分似乎也存储在_SESSION中。如果_SESSION在其中存储相同的小型数组(文件中存储内容的副本),则打开文件写入单个值然后再次保存就没有意义。您也可以直接覆盖现有文件。这样...

$writeToFile = json_encode($_SESSION[mydata]);
$fh = fopen("/path/to/username.json","w+");
fwrite($fh,$writeToFile);
fclose($fh);

// You could also use file_put_contents but most prefer
// to use fopen()

3)。我将假设您存储的密码是加密的,没有人可以键入[yourdomain] /users/username.json来查看json文件的原始输出。您可能要确保无法从浏览器访问 .json 文件。您可以使用.htaccess来做到这一点。

答案 3 :(得分:-1)

此代码中的问题是,您每次创建一个新的子数组时都在创建: 更改此:

$arr_data[][$_SESSION['username']]['favourite'] = $formdata;

对此

if(isset($arr_data[$_SESSION['username']])) {
  $arr_data[$_SESSION['username']]['favourite'] = $formdata;
}