2015-08-17 12 views
5

Mam dwa obiekty JSON i chciałbym porównać ich strukturę. Jak mogę to zrobić?PHP - porównaj strukturę dwóch obiektów JSON

Obiekty te są generowane "w locie" i w zależności od zawartości dynamicznej. Oznacza to, że obiekty są zawsze zawsze inne niż, ale przez większość czasu mają one tę samą strukturę o tej samej strukturze. Chcę móc wychwycić zmiany po ich wystąpieniu.

Przykład: te dwa przedmioty powinny być uważane za równej, ponieważ oba mają taką samą strukturę: var indeksu i znaczniki tablicy.

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

Myśli?

+0

więc chcesz sprawdzić, czy obiekt ma 1 te same pola co obiekt 2? – treegarden

+0

Tak, dokładnie. Próbowałem użyć RecursiveArrayIterator :: hasChildren() w celu iteracji tylko liści, ale to rozwiązanie nie wydaje mi się eleganckie. Może ktoś zna lepszy sposób? – Boarking

+0

@Boarking, czy to działa? – vonUbisch

Odpowiedz

1

To trochę trudne, ale dostajesz zdjęcie;

$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; 

powraca:

Obiekty nie są takie same. Nie znaleziono indeksu właściwości dla pozycji "2". Nie znaleziono znaczników własności w pozycji "2".

+0

Problem dotyczy domyślnej tablicy. Jak mogę to wygenerować? Mam tylko dwa obiekty JSON. array_keys() również nie jest dobrą opcją, ponieważ nie jest rekursywna. Moje rzeczywiste obiekty są bardzo duże i mają wiele poziomów zagnieżdżania. Muszę móc wszystko porównać. – Boarking

+0

Czy nie można oczekiwać określonej struktury? O ile wiem, aby to zrobić skutecznie, musisz się czegoś spodziewać. – vonUbisch

+0

Nie mam pojęcia, czego się spodziewam. Wiem tylko, że mam dwa obiekty JSON, które prawdopodobnie są takie same, ale muszę się upewnić, zanim przejdę dalej. – Boarking

-1

można przekonwertować ciąg json do tablicy php następnie użyć array_diff ($ arr1, $ arr2) funkcja porównać nowo utworzoną tablicę z innej tablicy wynik jest tablica zawierająca elementy pierwsza tablica, która nie istnieje w drugiej tablicy

przykład:

<?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

Chodzi ci o strukturze, jak modelu tablicy jak:

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

Jeśli to, co chce uzyskać, spróbuj tego ...

$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>"; 
     */ 
    } 

} 

Przykładowe wyjście:

same structure 
same structure 
different structure 
different structure 
7

## można korzystać z tej biblioteki TreeWalker php.##

TreeWalker jest prosty i smal API w PHP
(I rozwinął tę bibliotekę, mam nadzieję, że to pomaga)

oferuje dwie metody
1- Get JSON różnicę
2- Edycja json wartość (rekurencyjnie)

metoda ta zwróci diference między json1 i 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 
}