2015-08-17 20 views
5

Tôi có hai đối tượng JSON và tôi muốn so sánh cấu trúc của chúng. Tôi làm nó như thế nào?PHP - so sánh cấu trúc của hai đối tượng JSON

Đối tượng đó đang được tạo liên tục và tùy thuộc vào nội dung động. Điều đó có nghĩa là các đối tượng là luôn khác nhau nhưng phần lớn thời gian có cấu trúc giống nhau. Tôi muốn có thể nắm bắt các thay đổi khi chúng xảy ra.

Ví dụ: Hai đối tượng này cần được xem xét như bằng, bởi vì cả hai đều có cùng một cấu trúc : chỉ số var và thẻ mảng.

{ 
    "index": 0, 
    "tags": [ 
     "abc" 
    ] 
} 
{ 
    "index": 1, 
    "tags": [ 
     "xyz" 
    ] 
} 

Suy nghĩ?

+0

vì vậy bạn muốn kiểm tra xem đối tượng có 1 các trường giống với đối tượng 2? – treegarden

+0

Vâng, chính xác. Tôi đã cố gắng sử dụng RecursiveArrayIterator :: hasChildren() để lặp lại trên lá chỉ nhưng giải pháp này không có vẻ với tôi một thanh lịch. Có thể ai đó biết một cách tốt hơn? – Boarking

+0

@Boarking, bạn có làm việc đó không? – vonUbisch

Trả lời

1

Đó là một chút thô, nhưng bạn nhận được hình ảnh;

$json = '[ 
     { 
      "index": 0, 
      "tags": [ 
       "abc" 
      ] 
     }, 
     { 
      "index": 1, 
      "tags": [ 
       "xyz" 
      ] 
     }, 
     { 
      "foo": 2, 
      "bar": [ 
       "xyz" 
      ] 
     }]'; 

$array = json_decode($json, true); 
$default = array_keys($array[0]); 

$error = false; 
$errors = array(); 
foreach ($array as $index => $result): 
    foreach ($default as $search): 
     if (!isset($result[$search])): 
      $error = true; 
      $errors[] = "Property '{$search}' at entry '{$index}' not found. "; 
     endif; 
    endforeach; 
endforeach; 

if ($error): 
    echo 'Objects are not the same. '; 
    foreach ($errors as $message): 
     echo $message; 
    endforeach; 
endif; 

lợi nhuận:

Đối tượng là không giống nhau. Không tìm thấy 'chỉ mục' thuộc tính tại mục '2'. Không tìm thấy thẻ 'thuộc tính' tại mục '2'.

+0

Vấn đề ở đây là với mảng mặc định. Làm thế nào tôi có thể tạo ra nó? Tất cả những gì tôi có là hai đối tượng JSON. array_keys() cũng không phải là một lựa chọn tốt vì nó không đệ quy. Các đối tượng thực sự của tôi rất lớn và có nhiều cấp độ làm tổ. Tôi phải có khả năng so sánh mọi thứ. – Boarking

+0

Không thể mong đợi một cấu trúc nhất định? Theo như tôi biết, để làm điều này một cách hiệu quả bạn sẽ cần phải mong đợi một cái gì đó. – vonUbisch

+0

Tôi không có ý tưởng về những gì tôi đang mong đợi. Tất cả những gì tôi biết là tôi có hai đối tượng JSON có khả năng giống nhau nhưng tôi phải chắc chắn trước khi tôi tiếp tục. – Boarking

-1

Bạn có thể chuyển đổi các chuỗi json để một mảng php sau đó sử dụng array_diff ($ arr1, $ arr2) chức năng để so sánh các mảng mới được tạo ra với mảng khác kết quả là một mảng chứa các yếu tố của mảng đầu tiên mà không tồn tại trong mảng khác

dụ:

<?php 
    $array1 = '{"name":"myname","age":"40"}'; 
    //convert the obtained stdclass object to an array 
    $array1 = (array) json_decode($array1); 



    $array2 = array("name"=>"myname123","age"=>10); 

    print_r($array2); 

    $result_array = array_diff($array1,$array2); 


    if(empty($result_array[0])){  
     echo "they have the same structure "; 
    } 



?> 
0

Bạn có nghĩa là bởi cấu trúc, giống như mảng mô hình như:

array ('index' => int, 'tags' => array()) 

Nếu đó là những gì bạn đang cố gắng để có được, hãy thử này ...

$arr1 = array (
    array (
     'index' => 0, 
     'tags' => ['abc'] 
    ), 
    array (
     'index' => 1, 
     'tags' => ['xyz'] 
    ), 
    array (
     'index' => 2, 
     'tags' => ['xyz'], 
     'boom' => 'granade' 
    ), 
    array (
     'index' => 3, 
     'tags' => 'xyz' 
    ) 
); 

$holder = array(); 

$model = array ('index' => 0, 'tags' => array()); 

for ($i = 0;$i < count($arr1); $i++) 
{ 
    $holder = array_diff(array_merge_recursive($arr1[$i], $model), $model); 

    if (!empty($holder)) 
    { 
     echo "different structure<br>"; 
    } 
    else 
    { 
     echo "same structure<br>"; 

     // for further validation 
     /* 
     $keys = array_keys($model); 

     if (is_int($arr1[$i][$keys[0]]) && is_array($arr1[$i][$keys[1]])) 
      echo "same structure<br>"; 
     else 
      echo "different structure<br>"; 
     */ 
    } 

} 

Mẫu đầu ra:

same structure 
same structure 
different structure 
different structure 
7

## Bạn có thể sử dụng thư viện này TreeWalker php.##

TreeWalker là một API đơn giản và smal trong php
(tôi phát triển thư viện này, tôi hy vọng nó sẽ giúp bạn)

Nó cung cấp hai phương pháp
1- Nhận chênh lệch json
2- Sửa json giá trị (đệ quy)

phương pháp này sẽ trở lại diference giữa json1 và json2

$struct1 = array("casa"=>1, "b"=>"5", "cafeina"=>array("ss"=>"ddd"), "oi"=>5); 
$struct2 = array("casa"=>2, "cafeina"=>array("ss"=>"dddd"), "oi2"=>5); 

//P.s 
print_r($treeWalker->getdiff($struct1, $struct2)) 

{ 
    new: { 
     b: "5", 
     oi: 5 
    }, 
    removed: { 
     oi2: 5 
    }, 
    edited: { 
     casa: { 
      oldvalue: 2, 
      newvalue: 1 
     }, 
     cafeina/ss: { 
      oldvalue: "dddd", 
      newvalue: "ddd" 
     } 
    }, 
    time: 0 
} 
Các vấn đề liên quan