Сравнение файла JSON и файла PHP

#php #json

#php #json

Вопрос:

Первый пост, любая помощь приветствуется.

У меня есть файл PHP (массив) с данными из базы данных, которые мне нужно сравнить с файлом JSON (объектом). Просматривая форумы, я видел материалы о запросах jQuery и AJAX, поэтому я подумал, может быть, мне нужно использовать их для моего решения.

Массив PHP

 <?php 
$codes = [
[
    'code' => '1111',
    'name' => 'Management',
],
[
    'code' => '1305',
    'name' => 'Price',
],
[
    'code' => '1161',
    'name' => 'Service',
]
  

и массив продолжается.

Объект JSON

 [{"name":"Management","code":"1111","accountingArea":"3194","managerUsername":null},
{"name":"Storage","code":"9033","accountingArea":"3194","managerUsername":null}]
  

это способ форматирования объекта JSON.
По какой-то причине у него нет имени, и я не знаю, является ли это проблемой, когда дело доходит до сравнения двух разных файлов.

Продукт должен быть PHP-скриптом, который сообщает пользователю, какие записи отсутствуют в другом файле.

Единственное, что нужно сравнить, это коды.

Я еще ничего не делал с файлами JSON и тоже новичок в PHP. Пока я включил только оба файла в свой файл сценария и не знаю, с чего начать.

Ответ №1:

Вы можете взять JSON из файла в виде строки и использовать json_decode() функцию php, эта функция вернет массив php, затем вы можете просто создать cicle foreach и проверить коды

Ваш код должен быть похож на этот

 <?php
    $codes = [
    [
        'code' => '1111',
        'name' => 'Management',
    ],
    [
        'code' => '1305',
        'name' => 'Price',
    ],
    [
        'code' => '1161',
        'name' => 'Service',
    ]];
    
    $json_str = '[{"name":"Management","code":"1111","accountingArea":"3194","managerUsername":null},
    {"name":"Management","code":"11141","accountingArea":"3194","managerUsername":null},
    {"name":"Management","code":"1305","accountingArea":"3194","managerUsername":null},
    {"name":"Management","code":"1161","accountingArea":"3194","managerUsername":null},
    {"name":"Storage","code":"9033","accountingArea":"3194","managerUsername":null}]';
    $json_array = json_decode($json_str, true);
    
    $result = array();
    $codesN = array_column($codes, 'code');
    
    $i = 0;
    for($i; $i < count($json_array); $i  ) {
       if(in_array($json_array[$i]["code"], $codesN)) {
        $result[] = $json_array[$i]["code"];
       }
    }
    
    var_dump($result);
  

Это вернет:

 array(3) {
  [0]=>
  string(4) "1111"
  [1]=>
  string(4) "1305"
  [2]=>
  string(4) "1161"
}
  

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

1. Как у вас дела $json_array[$i]["code"] == $codes[$i]["code"] , если оба массива не имеют одинаковой длины? Вам нужно выполнить цикл для каждого кода в формате json и сравнить его во всех кодах в php массиве

2. Это зависит от того, что он явно хочет сделать, он также может получить один из двух массивов и выполнить все пользовательские проверки

3. Это также не работает, потому json_decode() что по умолчанию будет декодироваться в объект, и ему явно не было указано преобразовать в ассоциативный массив.

4. @pavelbere вы тестировали описанную выше функцию? вы сравниваете массивы на основе $i, а не на основе кода!!!! например, если первый код равен 1 в массиве json, а 1 существует в массиве php под номером 4, у вас будет пустое сравнение и ложный результат!

5. @Burhan Kashour Я просто предлагаю идею о том, как это может работать, я не знаю, что именно нужно автору, очевидно, что это не рабочее решение, если кто-то хочет его использовать, он должен адаптировать код для конкретного случая

Ответ №2:

Попробуйте это. Пошаговое объяснение см. в комментариях.

Вывод:

 array(2) {
  [1]=>
  string(4) "1305"
  [2]=>
  string(4) "1161"
}
  

Код:

 <?php

// Your input array.
$codes = [
    [
        'code' => '1111',
        'name' => 'Management',
    ],
    [
        'code' => '1305',
        'name' => 'Price',
    ],
    [
        'code' => '1161',
        'name' => 'Service',
    ]
];

// Your input JSON.
$json = '[{"name":"Management","code":"1111","accountingArea":"3194","managerUsername":null},{"name":"Storage","code":"9033","accountingArea":"3194","managerUsername":null}]';

// Get differences:
// Get values from $codes that are not present in $json.
// Switch the arguments to perform the inverse comparison.
$diff = array_diff(
    array_column($codes, 'code'),
    array_column(json_decode($json, TRUE), 'code')
);

var_dump($diff);
/*
Output:
array(2) {
  [1]=>
  string(4) "1305"
  [2]=>
  string(4) "1161"
}
*/
  

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

1. Должен ли я вводить все данные из 2 файлов в мой новый PHP-файл? Или я могу работать с require / inlcude?

2. Я не уверен, что полностью понимаю ваш вопрос. Но если ваши входные данные (массив и JSON) находятся в разных местах, вы можете импортировать их, используя либо include() или require() .