Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][PHP]usuwanie powtarzających się elementów z tablicy
Forum PHP.pl > Forum > Przedszkole
ukaszq
Witam. Szukam pomocy, nie potrafie sobie poradzić z usuwaniem powtarzających się elementów z tablicy.
Pobieram XML, w którym mam około 100 nazw, w większości te nazwy powtarzają się, chciałbym aby wyświetlił mi tylko zgrupowane nazwy, bez powtórzeń.
Wiem, ze muszę użyć array_unique(), tylko nie wiem jak go użyć w moim skrypcie. Proszę o pomoc.

Moj skrypt wygląda tak:

  1.  
  2. $url = "plik.xml"
  3. $xml = file_get_contents($url);
  4. $xml1= simplexml_load_string($xml);
  5. foreach($xml1->oferta as $page) {
  6. $tmp = $page->attributes();
  7.  
  8. if(!empty($tmp['nazwa'])){
  9. $ile = preg_match('/Odlot/', $tmp['nazwa']);
  10.  
  11. if($ile == true){
  12. $nazwa = $tmp['nazwa']."<br />";
  13. }else{
  14. $nazwa = "";
  15. }
  16.  
  17. }
  18. }
piotrooo89
nie znamy struktury XML'a ale strzelam że musisz zrobić:

  1. $tab = array_unique($xml1->oferta);
ukaszq
Struktura, to:
  1. <oferta nazwa="Nazwa1" />
  2. <ceny Cena="1.00" />
  3. </oferta>


Kiedy robię tak:
  1. $url = "plik.xml"
  2. $xml = file_get_contents($url);
  3. $xml1= simplexml_load_string($xml);
  4. [b]
  5. $tab = array_unique($xml->oferta);[/b]
  6.  
  7. foreach($tab as $page) {
  8. $tmp = $page->attributes();
  9.  
  10. if(!empty($tmp['nazwa'])){
  11. $ile = preg_match('/Odlot/', $tmp['nazwa']);
  12.  
  13. if($ile == true){
  14. $nazwa = $tmp['nazwa']."<br />";
  15. }else{
  16. $nazwa = "";
  17. }
  18.  
  19. }
  20. }


To wyrzuca mi błąd:
  1. Warning: array_unique() expects parameter 1 to be array, object given in...

Wiem, ze cos zle robie, ale nie wiem gdzie to wstawić.
Proszę o pomoc.
b4x
  1. $url = "plik.xml"
  2. $xml = file_get_contents($url);
  3. $xml1= simplexml_load_string($xml);
  4. $tab = $xml->oferta;
  5.  
  6. $set = array();
  7.  
  8. foreach($tab as $page)
  9. {
  10. $tmp = $page->attributes();
  11.  
  12. if( !empty($tmp['nazwa']) )
  13. {
  14. if(in_array($tmp['nazwa'], $set)) continue;
  15.  
  16. $set[] = $tmp['nazwa'];
  17.  
  18. $ile = preg_match('/Odlot/', $tmp['nazwa']);
  19.  
  20. if($ile == true)
  21. {
  22. $nazwa = $tmp['nazwa']."<br />";
  23. }
  24. else
  25. {
  26. $nazwa = "";
  27. }
  28. }
  29. }


Zobacz to
piotrooo89
to rzutuj to na array, tzn:

  1. $t = (array)$xml->oferta;
  2. $tab = array_unique($t);
blooregard
Cytat
Wiem, ze cos zle robie


No masz wyraźnie napisane, co robisz źle:
Warning: array_unique() expects parameter 1 to be array, object given ...
Ostrzeżenie: f-cja array_unique() oczekuje, że przekazany parametr nr. 1 będzie tablicą, a otrzymuje obiekt ...

Nieprawidłowy typ argumentu przekazany tablicy w PHP nie wywołuje błędu zatrzymującego skrypt, a jedynie ostrzeżenie. A skrypt nie ma prawa działać prawidłowo, jeśli od wyniku wykonania f-cji operującej na tablicy zależy jego dalsze działanie.

BTW, jest to, według mnie, jedna z znajwiększych bolączek PHP.
piotrooo89
tu jest problem związany z tym co zwraca simplexml_load_string, a zwraca nam obiekt, a nie tablice na której możemy użyć jakichkolwiek funkcji, tyle.
ukaszq
hmm... a jak to mogę pobrać jako tablicę?
piotrooo89
napisałem, rzutuj to co dostałeś na array.
b4x
Tak jak piotrooo89 napisał smile.gif
  1. $tab = (array) $xml->oferta;
ukaszq
Kiedy wpisuje to wyrzuca mi błąd:
  1. Fatal error: Call to a member function attributes() on a non-object in...

wskazując na:
  1. $tmp = $page->attributes();


  1. ...
  2. $t = (array)$xml->oferta;
  3. $tab = array_unique($t);
  4.  
  5. foreach($tab as $page) {
  6.  
  7. $tmp = $page->attributes();
  8. if(!empty($tmp['nazwa'])){
  9. $ile = preg_match('/Odlot/', $tmp['nazwa']);
  10.  
  11. if($ile == true){
  12. $nazwa = "<img src='".$this->view->baseUrl()."/img/strzalka_wycieczki.jpg' alt='Wycieczki autobusowe, objazdowe' width='7' height='8' /> ".$tmp['nazwa']."<br />";
  13. }else{
  14. $nazwa = "";
  15. }
  16. }
b4x
Wiesz co?

  1. $t = (array)$xml->oferta;
  2.  
  3. var_dump ($t); // Powie Ci wszystko :)
  4.  
  5. $tab = array_unique($t);
  6.  
  7. foreach($tab as $page) {
  8.  
  9. $tmp = $page->attributes();
  10. if(!empty($tmp['nazwa'])){
  11. $ile = preg_match('/Odlot/', $tmp['nazwa']);
  12.  
  13. if($ile == true){
  14. $nazwa = "<img src='".$this->view->baseUrl()."/img/strzalka_wycieczki.jpg' alt='Wycieczki autobusowe, objazdowe' width='7' height='8' /> ".$tmp['nazwa']."<br />";
  15. }else{
  16. $nazwa = "";
  17. }
  18. }
piotrooo89
no bo już nie będziesz miał możliwości dostania się do tego drzewa za pomocą jakichkolwiek metod z SimpleXML, zobacz sobie cos masz w tej tablicy.
ukaszq
Czy w ten sposób moge się teraz odwoływać?
  1. echo $t['nazwa'];
piotrooo89
a jak tablice? może pokaż co dostajesz. bo tak to strzelamy trochę w ciemno.
230005
A nie prościej to zrobić używając klas DOMDocument?

  1.  
  2. $array = array();
  3.  
  4. $xml = new DOMDocument();
  5. //to niżej to po to żeby nie uwzględniał białych znaków przy czytaniu
  6. $xml->preserveWhiteSpace = false;
  7. $xml->Load('xml.xml');
  8.  
  9. $xp = new DOMXpath($xml);
  10. $names = $xp->query('/*');
  11.  
  12. foreach($names as $vals) {
  13. if(!in_array($vals->nodeValue))
  14. $array[] = $vals->nodeValue;
  15. }
  16.  


Czy jakoś tak?

Edit:
Może nie prościej, ale to też wyjście i przedewszystkim działa smile.gif.
ukaszq
To wynilk var_dump($t):

  1. array(4) { ["@attributes"]=> array(14) { ["nazwa"]=> string(13) "Wojsko" ["skrot"]=> string(13) "Wojsko" ["pokoj"]=> string(4) "PAXP" ["typPokoju"]=> string(0) "" ["wyzywienie"]=> string(0) "" ["kraj"]=> string(6) "WLOCHY" ["miasto"]=> string(0) "" ["kategoria"]=> string(0) "" ["wyjazd"]=> string(10) "2010-11-06" ["powrot"]=> string(10) "2010-11-13" ["doroslych"]=> string(1) "1" ["cenaRez"]=> string(7) "125.00" ["waluta"]=> string(3) "PLN" ["cenaRezOryginalna"]=> string(8) "125 PLN" } ["ceny"]=> object(SimpleXMLElement)#83 (1) { ["@attributes"]=> array(1) { ["CenaPodstawowa"]=> string(7) "125.00" } } ["przelot"]=> object(SimpleXMLElement)#84 (2) { ["wylot"]=> object(SimpleXMLElement)#81 (1) { ["@attributes"]=> array(4) { ["odlot"]=> string(0) "" ["przylot"]=> string(0) "" ["godzinaOdlotu"]=> string(3) ":00" ["godzinaPrzylotu"]=> string(3) ":00" } } ["powrot"]=> object(SimpleXMLElement)#82 (1) { ["@attributes"]=> array(4) { ["odlot"]=> string(0) "" ["przylot"]=> string(0) "" ["godzinaOdlotu"]=> string(3) ":00" ["godzinaPrzylotu"]=> string(3) ":00" } } } ["paxy"]=> object(SimpleXMLElement)#85 (1) { ["@attributes"]=> array(27) { ["p0"]=> string(3) "1+0" ["p1"]=> string(3) "2+0" ["p2"]=> string(3) "1+1" ["p3"]=> string(3) "3+0" ["p4"]=> string(3) "2+1" ["p5"]=> string(3) "1+2" ["p6"]=> string(3) "4+0" ["p7"]=> string(3) "3+1" ["p8"]=> string(3) "2+2" ["p9"]=> string(3) "3+2" ["p10"]=> string(3) "4+1" ["p11"]=> string(3) "5+1" ["p12"]=> string(3) "4+2" ["p13"]=> string(3) "5+0" ["p14"]=> string(3) "5+2" ["p15"]=> string(3) "6+0" ["p16"]=> string(3) "6+1" ["p17"]=> string(3) "6+2" ["p18"]=> string(3) "7+0" ["p19"]=> string(3) "7+1" ["p20"]=> string(3) "7+2" ["p21"]=> string(3) "8+0" ["p22"]=> string(3) "8+1" ["p23"]=> string(3) "8+2" ["p24"]=> string(3) "9+0" ["p25"]=> string(3) "9+1" ["p26"]=> string(4) "10+0" } } }
piotrooo89
var_dump robi lekki syf, używaj print_r.
ukaszq
Jak mogę się odwołać do tych danych wyników np. do nazwy? print_r, pokazuje mi:

  1. Array ( [@attributes] => Array ( [nazwa] => Wojsko [skrot] => Wojsko [pokoj] => PAXP [typPokoju] => [wyzywienie] => [kraj] => WLOCHY [miasto] => [kategoria] => [wyjazd] => 2010-11-06 [powrot] => 2010-11-13 [doroslych] => 1 [cenaRez] => 125.00 [waluta] => PLN [cenaRezOryginalna] => 125 PLN ) [ceny] => SimpleXMLElement Object ( [@attributes] => Array ( [CenaPodstawowa] => 125.00 ) ) [przelot] => SimpleXMLElement Object ( [wylot] => SimpleXMLElement Object ( [@attributes] => Array ( [odlot] => [przylot] => [godzinaOdlotu] => :00 [godzinaPrzylotu] => :00 ) ) [powrot] => SimpleXMLElement Object ( [@attributes] => Array ( [odlot] => [przylot] => [godzinaOdlotu] => :00 [godzinaPrzylotu] => :00 ) ) ) [paxy] => SimpleXMLElement Object ( [@attributes] => Array ( [p0] => 1+0 [p1] => 2+0 [p2] => 1+1 [p3] => 3+0 [p4] => 2+1 [p5] => 1+2 [p6] => 4+0 [p7] => 3+1 [p8] => 2+2 [p9] => 3+2 [p10] => 4+1 [p11] => 5+1 [p12] => 4+2 [p13] => 5+0 [p14] => 5+2 [p15] => 6+0 [p16] => 6+1 [p17] => 6+2 [p18] => 7+0 [p19] => 7+1 [p20] => 7+2 [p21] => 8+0 [p22] => 8+1 [p23] => 8+2 [p24] => 9+0 [p25] => 9+1 [p26] => 10+0 ) ) )
piotrooo89
no odwołujesz sie w taki sposób jak do normalnej tablicy.
ukaszq
Dziękuję za pomoc.

Wszystko jest ok, ale wyswietla mi tylko jeden wpis z xml`a.
Tam tych wpisów jest około 100, a wyświetla mi tylko jeden.
Wyświetlam go przez foreach.

230005
A moim sposobem próbowałeś?
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.