Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Porównanie JSON, Porównanie dwóch plików z trzecim referencyjnym
topcio
post 8.01.2023, 13:48:20
Post #1





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


Witam ponownie

Mam taki problem, a właściwie pytanie techniczne

Mam trzy pliki JSON

Pierwszy plik JSON jest plikiem referencyjnym - w tym pliku nic się nie zmienia.
Drugi plik JSON zapisywane są w nim zmiany z jednego źródła
Trzeci plik JSON zapisywane są w nim zmiany z drugiego źródła

Raz na 8 godzin muszę zrobić porównanie i zmiany zrobione w plikach (drugim i trzecim) zastosować w pliku referencyjnym.

Za nic nie wiem jak się za to zabrać.

Ktoś cośquestionmark.gif?


Tak wygląda plik referencyjny
  1. {
  2. "AutoAccept": true,
  3. "AutoRank": true,
  4. "BlackList": true,
  5. "accountData": [
  6. {
  7. "UserID": 1234,
  8. "AccountName": "TEST1",
  9. "Rank": 1,
  10. },
  11. {
  12. "UserID": 4321,
  13. "AccountName": "TEST2",
  14. "Rank": 1,
  15. },
  16. {
  17. "UserID": 5678,
  18. "AccountName": "TEST3",
  19. "Rank": 1,
  20. },
  21. {
  22. "UserID": 8765,
  23. "AccountName": "TEST4",
  24. "Rank": 1,
  25. }
  26. ]
  27. }


w plikach 2 i 3 może do obiektu accountData zostać coś dodane albo usunięte

np.

Plik 2

  1. {
  2. "AutoAccept": true,
  3. "AutoRank": true,
  4. "BlackList": true,
  5. "accountData": [
  6. {
  7. "UserID": 1234,
  8. "AccountName": "TEST1",
  9. "Rank": 3,
  10. },
  11. {
  12. "UserID": 4321,
  13. "AccountName": "TEST2",
  14. "Rank": 1,
  15. },
  16. {
  17. "UserID": 8765,
  18. "AccountName": "TEST4",
  19. "Rank": 1,
  20. }
  21. ]
  22. }


Plik 3

  1. {
  2. "AutoAccept": true,
  3. "AutoRank": true,
  4. "BlackList": true,
  5. "accountData": [
  6. {
  7. "UserID": 1234,
  8. "AccountName": "TEST1",
  9. "Rank": 1,
  10. },
  11. {
  12. "UserID": 4321,
  13. "AccountName": "TEST2",
  14. "Rank": 1,
  15. },
  16. {
  17. "UserID": 5678,
  18. "AccountName": "TEST3",
  19. "Rank": 1,
  20. },
  21. {
  22. "UserID": 8765,
  23. "AccountName": "TEST4",
  24. "Rank": 1,
  25. },
  26. {
  27. "UserID": 9832,
  28. "AccountName": "TEST5",
  29. "Rank": 2,
  30. }
  31. ]
  32. }


Czyli plik wynikowy powinien wyglądać

  1. {
  2. "AutoAccept": true,
  3. "AutoRank": true,
  4. "BlackList": true,
  5. "accountData": [
  6. {
  7. "UserID": 1234,
  8. "AccountName": "TEST1",
  9. "Rank": 3,
  10. },
  11. {
  12. "UserID": 4321,
  13. "AccountName": "TEST2",
  14. "Rank": 1,
  15. },
  16. {
  17. "UserID": 8765,
  18. "AccountName": "TEST4",
  19. "Rank": 1,
  20. },
  21. {
  22. "UserID": 9832,
  23. "AccountName": "TEST5",
  24. "Rank": 2,
  25. }
  26. ]
  27. }


Wymyśliłem coś takiego

  1. foreach ($plik2['accountData'] as $user) {
  2. foreach ($plik_referencyjny['accountData'] as $new_user) {
  3. if ($user['UserID'] == !$new_user['UserID']) {
  4. unset($new_user);
  5. }
  6. }
  7. }
  8.  
  9. $encoded = json_encode($plik_referencyjny, JSON_PRETTY_PRINT);
  10. file_put_contents('plik_referencyjny.json', $encoded);


To porównanie jednego z plików potem robię z drugim

Pewnie nie jeden powie, że zrobione naokoło ale działa smile.gif

  1. $plik_referencyjny = 'C:\XAMPP\htdocs\Pik_referencyjny.json';
  2. $plik_pierwszy = 'C:\XAMPP\htdocs\Plik_pierwszy.json';
  3. $plik_drugi = 'C:\XAMPP\htdocs\Plik_drugi.json';
  4.  
  5. function compare_3_files($plik_referencyjny, $plik_pierwszy, $plik_drugi) {
  6.  
  7. $plik_referencyjny_input = file_get_contents($plik_referencyjny);
  8. $plik_referencyjny_json = json_decode($plik_referencyjny_input,true);
  9. $plik_pierwszy_input = file_get_contents($plik_pierwszy);
  10. $plik_pierwszy_json = json_decode($plik_pierwszy_input,true);
  11. $plik_drugi_input = file_get_contents($plik_drugi);
  12. $plik_drugi_json = json_decode($plik_drugi_input,true);
  13.  
  14. $tymczasowa_1_Nie_Zmionione['accountData'] = [];
  15. $tymczasowa_1_Zmienione['accountData'] = [];
  16. $tymczasowa_1_Nowe_Wspolne['accountData'] = [];
  17. $tymczasowa_1_Nowe['accountData'] = [];
  18. $tymczasowa_2_Nie_Zmionione['accountData'] = [];
  19. $tymczasowa_2_Zmienione['accountData'] = [];
  20. $tymczasowa_2_Nowe_Wspolne['accountData'] = [];
  21. $tymczasowa_2_Nowe['accountData'] = [];
  22. $wpolne_nie_zmienione['accountData'] = [];
  23. $wspolne_nowe['accountData'] = [];
  24. $tabela_koncowa['accountData'] = [];
  25.  
  26. // Tabela tymczasowa pliku pierwszego
  27. foreach ($plik_pierwszy_json['accountData'] as $user) {
  28. foreach ($plik_referencyjny_json['accountData'] as $old_user) {
  29. if ($old_user == $user) {
  30. array_push($tymczasowa_1_Nie_Zmionione['accountData'], $user);
  31. } else
  32. if ($old_user['UserID'] == $user['UserID'] && $old_user != $user) {
  33. array_push($tymczasowa_1_Zmienione['accountData'], $user);
  34. }
  35. }
  36. if (!in_array($user, $plik_referencyjny_json['accountData'])) {
  37. if (!in_array($user, $tymczasowa_1_Zmienione['accountData'])) {
  38. array_push($tymczasowa_1_Nowe_Wspolne['accountData'], $user);
  39. }
  40. }
  41. }
  42.  
  43. // Tabela tymczasowa pliku drugiego
  44. foreach ($plik_drugi_json['accountData'] as $user) {
  45. foreach ($plik_referencyjny_json['accountData'] as $old_user) {
  46. if ($old_user == $user) {
  47. array_push($tymczasowa_2_Nie_Zmionione['accountData'], $user);
  48. } else
  49. if ($old_user['UserID'] == $user['UserID'] && $old_user != $user) {
  50. array_push($tymczasowa_2_Zmienione['accountData'], $user);
  51. }
  52. }
  53. if (!in_array($user, $plik_referencyjny_json['accountData'])) {
  54. if (!in_array($user, $tymczasowa_2_Zmienione['accountData'])) {
  55. array_push($tymczasowa_2_Nowe_Wspolne['accountData'], $user);
  56. }
  57. }
  58. }
  59.  
  60. // Wpisy nie zmienione w obu plikach
  61. foreach ($tymczasowa_1_Nie_Zmionione['accountData'] as $tym_1) {
  62. foreach ($tymczasowa_2_Nie_Zmionione['accountData'] as $tym_2) {
  63. if ($tym_1 == $tym_2) {
  64. array_push($wpolne_nie_zmienione['accountData'], $tym_1);
  65. }
  66. }
  67. }
  68.  
  69. // Nowe tylko dla pliku pierwszego
  70. foreach ($tymczasowa_1_Nowe_Wspolne['accountData'] as $user) {
  71. if (!in_array($user, $tymczasowa_2_Nowe_Wspolne['accountData'])) {
  72. array_push($tymczasowa_1_Nowe['accountData'], $user);
  73. }
  74. }
  75.  
  76. // Nowe tylko dla pliku drugiego
  77. foreach ($tymczasowa_2_Nowe_Wspolne['accountData'] as $user) {
  78. if (!in_array($user, $tymczasowa_1_Nowe_Wspolne['accountData'])) {
  79. array_push($tymczasowa_2_Nowe['accountData'], $user);
  80. }
  81. }
  82.  
  83. // Nowe wpisy (takie same dla obu plików)
  84. foreach ($tymczasowa_1_Nowe_Wspolne['accountData'] as $user) {
  85. foreach ($tymczasowa_2_Nowe_Wspolne['accountData'] as $old_user) {
  86. if ($old_user == $user) { array_push($wspolne_nowe['accountData'], $user); }
  87. }
  88. }
  89.  
  90. // Wspólne dane
  91. foreach ($wpolne_nie_zmienione['accountData'] as $user) {
  92. array_push($tabela_koncowa['accountData'], $user);
  93. }
  94. foreach ($wspolne_nowe['accountData'] as $user) {
  95. array_push($tabela_koncowa['accountData'], $user);
  96. }
  97.  
  98. // Scalam dane (nowszy plik ma priorytet)
  99. $ktory_plik_nowszy = filemtime($plik_pierwszy) - filemtime($plik_drugi);
  100. if ($ktory_plik_nowszy > 0 ) {
  101. foreach ($tymczasowa_1_Zmienione['accountData'] as $user) {
  102. array_push($tabela_koncowa['accountData'], $user);
  103. }
  104. foreach ($tymczasowa_2_Zmienione['accountData'] as $user) {
  105. $flaga = 0;
  106. foreach ($tabela_koncowa['accountData'] as $newuser) {
  107. if($newuser['UserID'] == $user['UserID']) { $flaga = 1; }
  108. }
  109. if ($flaga == 0) { array_push($tabela_koncowa['accountData'], $user); }
  110. $flaga = 0;
  111. }
  112. } else {
  113. foreach ($tymczasowa_2_Zmienione['accountData'] as $user) {
  114. array_push($tabela_koncowa['accountData'], $user);
  115. }
  116. foreach ($tymczasowa_1_Zmienione['accountData'] as $user) {
  117. $flaga = 0;
  118. foreach ($tabela_koncowa['accountData'] as $newuser) {
  119. if($newuser['UserID'] == $user['UserID']) { $flaga = 1; }
  120. }
  121. if ($flaga == 0) { array_push($tabela_koncowa['accountData'], $user); }
  122. $flaga = 0;
  123. }
  124. }
  125.  
  126. if ($ktory_plik_nowszy > 0 ) {
  127. foreach ($tymczasowa_1_Nowe['accountData'] as $user) {
  128. array_push($tabela_koncowa['accountData'], $user);
  129. }
  130. foreach ($tymczasowa_2_Nowe['accountData'] as $user) {
  131. $flaga = 0;
  132. foreach ($tabela_koncowa['accountData'] as $newuser) {
  133. if($newuser['UserID'] == $user['UserID']) { $flaga = 1; }
  134. }
  135. if ($flaga == 0) { array_push($tabela_koncowa['accountData'], $user); }
  136. $flaga = 0;
  137. }
  138. } else {
  139. foreach ($tymczasowa_2_Nowe['accountData'] as $user) {
  140. array_push($tabela_koncowa['accountData'], $user);
  141. }
  142. foreach ($tymczasowa_1_Nowe['accountData'] as $user) {
  143. $flaga = 0;
  144. foreach ($tabela_koncowa['accountData'] as $newuser) {
  145. if($newuser['UserID'] == $user['UserID']) { $flaga = 1; }
  146. }
  147. if ($flaga == 0) { array_push($tabela_koncowa['accountData'], $user); }
  148. $flaga = 0;
  149. }
  150. }
  151.  
  152. return $tabela_koncowa['accountData'];
  153. }
  154.  
  155. echo "<pre>";
  156. print_r(compare_3_files($plik_referencyjny, $plik_pierwszy, $plik_drugi));
  157. echo "</pre>";
  158.  
  159. $plik_wynikowy_input = file_get_contents('C:\XAMPP\htdocs\Plik_wynikowy.json');
  160. $plik_wynikowy = json_decode($plik_wynikowy_input,true);
  161.  
  162. $plik_wynikowy['accountData'] = compare_3_files($plik_referencyjny, $plik_pierwszy, $plik_drugi);
  163. $manageGuild_encoded = json_encode($plik_wynikowy, JSON_PRETTY_PRINT);
  164. file_put_contents('C:\XAMPP\htdocs\Plik_wynikowy.json', $manageGuild_encoded);


Ten post edytował topcio 7.01.2023, 13:58:29
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 22:05