Добавить данные в начало файла JSON, используя форму PHP - PullRequest
2 голосов
/ 27 апреля 2020

Я хотел добавить php из данных в файле JSON в начало.

Я использовал некоторые PHP функции, такие как -

  1. array_unshift ( $ array_data, $ extra);

  2. $ array_data = array_reverse ($ array_data);

Пример -

<?php  
 $message = '';  
 $error = '';  
 if(isset($_POST["submit"]))  
 {  
      if(empty($_POST["name"]))  
      {  
           $error = "<label class='text-danger'>Enter Name</label>";  
      }  
      else if(empty($_POST["author"]))  
      {  
           $error = "<label class='text-danger'>Enter Author</label>";  
      }  
      else if(empty($_POST["category"]))  
      {  
           $error = "<label class='text-danger'>Enter Thumbnail</label>";  
      }  
      else if(empty($_POST["url"]))  
      {  
           $error = "<label class='text-danger'>Enter URL</label>";  
      }  
      else  
      {  
          if(file_exists('wallpaper.json'))  
          {  
               $current_data = file_get_contents('wallpaper.json');  
               $array_data = json_decode($current_data, true);  
               $extra = array(  
                    'name'               =>     $_POST['name'],  
                    'author'          =>     $_POST["author"],  
                    'category'     =>     $_POST["category"],  
                    'url'     =>     $_POST["url"]  

               );  
               $array_data[] = $extra;  
               //array_unshift($array_data, $extra); // used this as well
               $array_data = array_reverse($array_data);
               $final_data = json_encode($array_data);
               if(file_put_contents('wallpaper.json', $final_data))  
               {  
                    $message = "<label class='text-success'>File Appended Success fully</p>";  
               }  
          }  
          else  
          {  
               $error = 'JSON File not exits';  
          }  
     }  
 }
 ?>

Обе эти PHP функции работают отлично, пока вы не добавите данные 2 раза, но как только вы добавите третьи данные или более, тогда это будет выглядеть так -

[
  {
    "name": "3",
    "author": "3",
    "category": "3",
    "url": "3"
  },
  {
    "name": "1",
    "author": "1",
    "category": "1",
    "url": "1"
  },
  {
    "name": "2",
    "author": "2",
    "category": "2",
    "url": "2"
  }
]

Но это должно выглядеть так -

[
  {
    "name": "3",
    "author": "3",
    "category": "3",
    "url": "3"
  },
  {
    "name": "2",
    "author": "2",
    "category": "2",
    "url": "2"
  },
  {
    "name": "1",
    "author": "1",
    "category": "1",
    "url": "1"
  }
]

Ответы [ 3 ]

2 голосов
/ 27 апреля 2020

В начале у вас есть [1], затем вы вставляете [2] и после $ array_data [] = $ extra; идет к [1] ​​[2] и обратному массиву [2] [1]. В этот момент, когда вы вставляете новое значение, у вас есть [2] [1] [3] и после реверсирования [3] [1] [2] решение будет сторнировано перед вставкой экстра:

test. php:

    <?php
      if(file_exists('wallpaper.json'))
      {

           $current_data = file_get_contents('wallpaper.json');
           $array_data = json_decode($current_data, true);
                          $extra = array(
                               'name'    =>     $_REQUEST['name'],
                               'author'  =>     $_REQUEST["author"],
                               'category'=>     $_REQUEST["category"],
                               'url'     =>     $_REQUEST["url"]

                          );
                          echo $extra['name'];
           $array_data = array_reverse($array_data);
           $array_data[] = $extra;
           $array_data = array_reverse($array_data);
           $final_data = json_encode($array_data);
           if(file_put_contents('wallpaper.json', $final_data))
           {
                $message = "<label class='text-success'>File Appended Success fully</p>";
           }
      }
      ?>

для запуска Я использовал для передачи параметров:

http://localhost/test.php?name=4&author=4&category=4&url=4
1 голос
/ 27 апреля 2020

Во-первых, не помещайте sh данные $_POST в отдельный подмассив. Уже в правильной структуре вызывать array_unshift() непосредственно на нем. Другими словами, вам не нужно индексировать его - unshift будет применять для вас клавишу 0.

Код: ( Демо )

$fileContents = '[{"name":"B1","author":"B2","category":"B3","url":"B4"},{"name":"A1","author":"A2","category":"A3","url":"A4"}]';

$array = json_decode($fileContents, true);

$_POST = [
    'name' => 'C1',
    'author' => 'C2',
    'category' => 'C3',
    'url' => 'C4',
];

array_unshift($array, $_POST);
echo json_encode($array);

Вывод:

[{"name":"C1","author":"C2","category":"C3","url":"C4"},{"name":"B1","author":"B2","category":"B3","url":"B4"},{"name":"A1","author":"A2","category":"A3","url":"A4"}]

Во-вторых, я не поддерживаю идею создания этого файла json, если есть способ избежать этого. Я имею в виду, что с увеличением размера файла вашему серверу придется работать все больше и больше, чтобы анализировать json, манипулировать им, перекодировать каждый раз, когда вы хотите внести изменение.

Я мог бы порекомендовать вам реструктурировать ваш файл так, чтобы он представлял собой текстовый файл, представляющий собой набор json строк, каждая из которых написана отдельно в каждой строке. Таким образом, вам не нужно каждый раз распаковывать и перепаковывать данные, вы просто добавляете новую строку json к файлу и уходите. * Предостережение, это не удастся, если данные, которые вы храните, содержат символы новой строки - я не знаю, может ли ваш проект получить такие данные.


ps Если вы не разработчик ультра-пуристов и ваши входные данные так же ручны, как и вы видите, вы можете взломать строку json и уменьшить нагрузку следующим образом:

Код: ( Demo )

$newJson = json_encode($_POST);

if ($fileContents) {
    $fileContents = substr_replace($fileContents, $newJson . ',', 1, 0);
} else {
    $fileContent = '[' . $newJson . ']';
}
echo $fileContents;
0 голосов
/ 27 апреля 2020
$posted[] = $_POST; 
$current_data = file_get_contents('wallpaper.json');
$decoded = json_decode($current_data,true);

//You merge together posted array values with the current array
//that is in the current file (after decoding the json)
//$posted is first part of the array because you start to merge from that
//array
$new_arr = array_merge($posted, $decoded); 

//Encode the new array into JSON and save it
$encoded_json = json_encode($new_arr,);
file_put_contents('wallpaper.json', $encoded_json);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...