Сравните два JSON в PHP

1

Вот мой код в PHP,

<?php
$query = "SELECT items FROM 'ppmp' ORDER BY date DESC LIMIT 1";
  if($result2 = $con->query($query)) {
   $row = $result2->fetch_array();
  $items2 = $row['items'];
 }
 $items = $_POST['ris4'];
 $items = json_decode($items,true);
 $items2 = json_decode($items2,true);

for($i = 0; $i < sizeOf($items["items"]);$i++){
for($i2 = 0; $i2 < sizeOf($items2["items"]); $i2++){
    $val = $items["items"][$i]["Desc"];
    $val2 = $items2["items"][$i2]["Desc"];
    print_r($val);
    print_r($val2);
    if(strcmp($val, $val2) == 0){
     echo "same";
    }
}
}
?>

Я собираюсь вычитать количество продуктов. Но я не могу определить, совпадают ли два описания.

Я использую strcmp() но он не работает. Я повторяю описания и имеет одинаковые описания. но == оператор не работает.

Это макет $items2 JSON,

{"items":[{"Desc":" Pencil ","Qty":25},{"Desc":" Ballpen ","Qty":5},{"Desc":" Tech Pen ","Qty":20}]}

И вот $items,

{"items":[{"Desc":" Tech Pen ","Qty":15},{"Desc":" Ballpen ","Qty":4}]}
  • 0
    Рекурсия наверное. Но просмотр ваших двух массивов JSON может серьезно помочь.
  • 0
    Откуда этот «результат $»?
Показать ещё 4 комментария
Теги:

4 ответа

1

Я бы предложил вам использовать array_diff. Таким образом, вы можете убедиться, что они точно соответствуют контенту в структуре JSON.

    $it_1 = json_decode($items, TRUE);
    $it_2 = json_decode($items2, TRUE);
    $result_array = array_diff($it_1,$it_2);


    if(empty($result_array[0])){     
        echo "they are same";
    }
  • 0
    если бы я использовал json_decode ($ items.TRUE); я не могу использовать количество ($ items-> items);
  • 0
    @Fawzan Это тоже правда, но я не понимаю, почему он говорит, что strcmp ($ val, $ val2) не работает. Я проверил его на своем локальном хосте, и он отлично работает. Во всяком случае, я считаю ваше решение хорошим. ура :)
Показать ещё 6 комментариев
0

Предположим, у нас есть...

JSON OBJ 1 {"key1": "message", "key2": "message", "key3": "message"}

JSON OBJ 2 {"key2": "message2", "key3": "message3", "key1": "message1"}

Используя такой код:

$responseMatch = json_decode($obj1) == json_decode($obj2);
return $responseMatch ? 'responses match!' : 'responses dont match!';

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

0

Предположим, что ваша "Desc" - это простая текстовая строка, которую вы можете проверить следующим образом:

if (strcmp($val, $val2) !== 0) {
   //they are not the same
}

ОБНОВИТЬ:

$items1 = json_decode('{"items":[{"Desc":" Tech Pen ","Qty":15},{"Desc":" Ballpen ","Qty":4}]}');
$items2 = json_decode('{"items":[{"Desc":" Pencil ","Qty":25},{"Desc":" Ballpen ","Qty":5},{"Desc":" Tech Pen ","Qty":20}]}');

for($i=0;$i<count($items1->items);$i++){
    for($j=0;$j<count($items2->items);$j++){
        $val = $items1->items[$i]->Desc;
        $val2 = $items2->items[$j]->Desc;
        if( strcmp($val, $val2) == 0 ){
            echo "Item ".$val." match with ".$val2." ";
            //$items2->items[$j]->Qty -= $items1->items[$i]->Qty;
        }else{
            echo "Item ".$val." don't match with ".$val2." ";
        }
    }
}

Вы говорите, что это не работает, но я тестирую это на своем локальном хосте и работает нормально.

  • 0
    Это все еще не работает, попробуйте проверить мой обновленный JSON в последнем.
  • 0
    Да. У вас есть как расшифровка: Карандаш и Техническое перо. Если вы хотите проверить, одинаковы ли они, вам нужно сделать if (strcmp ($ val, $ va2) == 0) {
Показать ещё 4 комментария
0

Попробуй это.

$items1 = json_decode('{"items":[{"Desc":" Tech Pen ","Qty":15},{"Desc":" Ballpen ","Qty":4}]}');
$items2 = json_decode('{"items":[{"Desc":" Pencil ","Qty":25},{"Desc":" Ballpen ","Qty":5},{"Desc":" Tech Pen ","Qty":20}]}');

for($i=0;$i<count($items1->items);$i++){
    for($j=0;$j<count($items2->items);$j++){
        $val = $items1->items[$i]->Desc;
        $val2 = $items2->items[$j]->Desc;
        if($val == $val2){
            $items2->items[$j]->Qty -= $items1->items[$i]->Qty;
        }
    }
}
print_r($items2);

Выйдет

[items] => Array
        (
            [0] => stdClass Object
                (
                    [Desc] =>  Pencil 
                    [Qty] => 25
                )

            [1] => stdClass Object
                (
                    [Desc] =>  Ballpen 
                    [Qty] => 1
                )

            [2] => stdClass Object
                (
                    [Desc] =>  Tech Pen 
                    [Qty] => 5
                )

        )
  • 0
    это работает, если я установлю $ items1 таким образом. я попытался prin_r $ items и $ items1, они оба одинаковы ..
  • 0
    разница в том, что $ items = $ _POST ['кое-что']; это имеет эффект?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню