Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML] Porównywanie dwóch plików XML
Forum PHP.pl > Forum > XML, AJAX
TomASS
Mam dwa pliki XML o takiej samej strukturze:
pierwszy.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <records>
  3. <record>
  4.      <id>1</id>
  5.      <numer>222</numer>
  6.      <imie>Tomasz</imie>
  7.      <nazwisko>Maly</nazwisko>
  8. </record>
  9. <record>
  10.      <id>2</id>
  11.      <numer>33333</numer>
  12.      <imie>Marek</imie>
  13.      <nazwisko>Maly</nazwisko>
  14. </record>
  15. </records>

i drugi.xml:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <records>
  3. <record>
  4.      <id>2</id>
  5.      <numer>33333111111</numer>
  6.      <imie>Marek</imie>
  7.      <nazwisko>Maly</nazwisko>
  8. </record>
  9. <record>
  10.      <id>3</id>
  11.      <numer>44444444</numer>
  12.      <imie>Jatrek</imie>
  13.      <nazwisko>Maly</nazwisko>
  14. </record>
  15.  
  16. </records>

Zastanawiam się jak w najlepszy sposób osiągnąć trzy tablice wskazujące na różnice pomiędzy nimi:
  • pierwsza tablica informuje które rekordy są w drugim pliku a nie ma w pierwszym tutaj (chodzi o ID):
    1. <?php
    2. $dodane[0] = 3;
    3. ?>

    czyli został dodany 3 reokrd
  • druga tablica informuje o elementach usuniętych w drugim pliku, tutaj:
    1. <?php
    2. $usuniete[0] = 1;
    3. ?>

    co oznacza, że w pierwszym pliku był rekord 1 ale już go nie ma.
  • trzecia tablica oznacza która wartość została zmieniona, u nas $modif[ID][pole]='nowa_wartosc':
    1. <?php
    2. $modif[2]['numer']='33333111111';
    3. ?>
Próbowałe przez xml_parse wpisywać wszystkie dane do dwuch tablic i na nich robić operacje, jednak wydaje mi się to mało wydajne i prób zaprzestałem :/
NuLL
Zamien oba obiekty w tablice...,
  1. <?php
  2. function recursive_array_unique($myArray)
  3.  {
  4.  $newArray = Array();
  5.  if (is_array($myArray))
  6.  {
  7.  foreach($myArray as $key=>$val)
  8.  {
  9.  if (is_array($val))
  10.  {
  11.  $val2 = arrayUnique($val);
  12.  }
  13.  else
  14.  {
  15.  $val2 = $val;
  16.  $newArray=array_unique($myArray);
  17.  $newArray=deleteEmpty($newArray);
  18.  break;
  19.  }
  20.  if (!empty($val2))
  21.  {
  22.  $newArray[$key] = $val2;
  23.  }
  24.  }
  25.  }
  26.  return ($newArray);
  27.  }
  28.  
  29. function deleteEmpty($myArray)
  30.  {
  31.  $retArray= Array();
  32.  foreach($myArray as $key=>$val)
  33.  {
  34.  if (($key<>"") && ($val<>""))
  35.  {
  36.  $retArray[$key] = $val;
  37.  }
  38.  }
  39.  return $retArray;
  40.  }
  41. ?>

.... kabuum i po bolu biggrin.gif Zmiany w masz w tablicy ale to sie przerobic na xml-a winksmiley.jpg Ot cala filozofia biggrin.gif
TomASS
Drogi kolego Nullu chyba nie do końca rozumiem Ciebie a Ty mnie tongue.gif

Gdzie tutaj masz porównywanie dwóch tablic?
Tutaj po prostu usuwasz z tablicy elementy o pustych kluczach lub wartościach.

Chciałbym coś takiego, że podam:

  1. <?php
  2. jak_sie_roznia($tablica1, $tablica2){
  3.  
  4. }
  5. ?>

i otrzymam różnice pomiędzy tablicami.
  1. <?php
  2. czego_brak($tablica1, $tablica2){
  3.  
  4. }
  5. ?>

brakujące elementy w tablica2 z tablica1

itp...

oczywiście miło byłoby aby słowa tablica zastąpić xml tongue.gif
mike
~TomASS no nie mów że nie dasz rady przepisać XML'a na tablicę? tongue.gif

Przeciez to proste jest. Lecisz jakimś SimpleXML'em i budujesz tablicę, a na nich jest prościej operować i tu już korzystasz z tego co dał ~NuLL
Zresztą napisał na początku - "Zamien oba obiekty w tablice".
TomASS
Nieno nie mówię, że nie dam rady przepisać xml w tablicę, tylko zastanawiam się do czego mi ta funkcja co podał kolega Null ? Czyżby chciał mi pokazać coś konkrentengo czy tylko pokazał mi jak operować na tablicach tongue.gif

Ale wielkie dzięki za zainteresowanie smile.gif
splatch
Funkcje do sprawdzania różnic/przecięć pomiędzy tablicami array_diff_assoc array_uintersec_uassoc, zrobić tablicę korzystając z funkcji NuLLa i można jechać winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.