Каков правильный способ вставить массив в файл с помощью PHP?

#php

#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 и другие методы, однако я не уверен, что лучше всего подходит для этого варианта использования.
Любые мысли / рекомендации о том, как я могу наилучшим образом достичь этого с желаемым результатом, высоко ценятся, спасибо!

Ответ №1:

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

Разница в том, что я переместился [] в конец $arr_data .

Комментарии:

1. Никогда не думал об этом, таким образом. действительно экономит много строк кода. 😛

2. Это было очень полезно и дало желаемый результат, спасибо!

Ответ №2:

Прежде чем добавлять его в array, вам нужно проверить, существует ли ключ, а затем продолжить, а не просто добавлять код.

 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);
}
  

Комментарии:

1. Спасибо за вашу помощь!

Ответ №3:

Я вижу, что большинство ответили на вопрос, но могу ли я также предоставить некоторые предложения (пищу для размышлений) по вашему процессу?

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.

Комментарии:

1. Спасибо за советы! Это часть курсовой работы, над которой я работаю, и это не будет живой сайт или что-то еще, исключительно для задания. Они хранятся в обычном формате . однако json нам было поручено использовать это, и нам не разрешено использовать защищенную базу данных или что-либо в этом роде.

Ответ №4:

Проблема в этом коде, вы создаете каждый раз новый подмассив: измените это:

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

К этому

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