Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Odczyt pliku XML + coś jeszcze
Pacyna
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 27.08.2010

Ostrzeżenie: (0%)
-----


Witam! Mam pewien problem, a mianowicie odczytałem poprawnie ten plik XML zamieszczony niżej,
  1. <inventory>
  2. <slot slotid="1"><item id="2490"/></slot>
  3. <slot slotid="2"><item id="2129"/></slot>
  4. <slot slotid="3"><item id="1988"><inside><item id="2546" count="200" /></inside></item></slot>
  5. <slot slotid="4"><item id="2463"/></slot>
  6. <slot slotid="5"><item id="2423"/></slot>
  7. <slot slotid="6"><item id="2525"/></slot>
  8. <slot slotid="7"><item id="2468"/></slot>
  9. <slot slotid="8"><item id="2643"/></slot>
  10. <slot slotid="9"><item id="2164"/></slot>
  11. <slot slotid="10"><item id="2165"/></slot>
  12. </inventory>


jednak chciałbym zrobić coś takiego: Bo gdy gracz nie ma w danym slocie itemu, to ten slot się w ogóle nie zapisuje do pliku gracza i właśnie tu jest problem. Chciałbym aby gdy gracz nie ma danego slota to skrypt php by wywołał np. jakiś obrazek w odpowiednie miejsce. Nie wiem jak to dokładnie wytłumaczyć abyście zrozumieli. Może zaczne od pokazania skryptu php.

http://wklej.org/hash/aea146ee657/

Jest to tak zrobione aby odczytywał sloty w taki sposób: '2','1','3','6','4','5','9','7','10','8'

Ok, przejdzmy do tego problemu, moze pokaze Wam to graficznie...

(IMG:http://i36.tinypic.com/2h3ud8h.jpg)

Otoz tak wyglada wywolanie skryptu gdy ktoś ma wszystkie sloty u siebie w pliku

natomiast tak:

(IMG:http://i36.tinypic.com/2462ahd.jpg)

Gdy nie ma jakiegoś slotu u siebie. Jak widzicie wszystko się przesunęło i zepsuło całą estetyke... I właśnie chciałbym uzyskać takie coś aby w miejsce slotu ktorego gracz nie ma pojawił się , nie wiem jakis obrazek lub tekst to juz moge sobie sam zeedytować, ale potrzebuje z tym pomocy bo probowałem wstawiać "else" i jakies "ify" ale zawsze pokazuje obrazek slotu ktorego gracz nie ma tyle razy ile gracz ma slotów... Mam nadzieje, ze zrozumieliscie o co mi chodzi, jakby cos jeszcze bylo niejasne prosze o napisanie. ;p

Pozdrawiam
Go to the top of the page
+Quote Post
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Patrzę na kod i łapię się za głowę... Tyle ile pól tyle razy podwójnie zagnieżdżony foreach. Już za samo to by Cię tu większość zjadła (IMG:style_emoticons/default/winksmiley.jpg) Jakby nie spojrzeć wystarczyło by byś przewidział choćby ELSE, którego nigdzie nie posiadasz.

To nie prościej byłoby lecieć jednym(!) foreachem po slotach i w zależności czy ów slot w strukturze istnieje uzupełniać go obrazkiem lub obrazkiem domyślnym. Jedynie w przypadku plecaka miałbyś inaczej. Ja bym nawet zawartość plecaka jako całkowicie osobna strukturę dorobił. Sam slot oznaczałby typ plecaka (kilka rodzajów) lub jego brak. Osobna struktura XML przechowywała by jego zawartość. Czyli inside byłoby osobnym węzłem za slotami.
  1. <inventory>
  2. <slot slotid="1"><item id="2490"/></slot>
  3. <slot slotid="2"><item id="2129"/></slot>
  4. <slot slotid="3"><item id="1988"></slot>
  5. <slot slotid="4"><item id="2463"/></slot>
  6. <slot slotid="5"><item id="2423"/></slot>
  7. <slot slotid="6"><item id="2525"/></slot>
  8. <slot slotid="7"><item id="2468"/></slot>
  9. <slot slotid="9"><item id="2164"/></slot>
  10. <slot slotid="10"><item id="2165"/></slot>
  11. <inside><item id="2546" count="200" /></inside>
  12. </inventory>

Zauważ, że usunąłem slotid="8"! Teraz lecąc w pętli po strukturze sprawdzam obecność określonego slotid. Jeśli jest wrzucam jego zawartość. Jeśli nie ma zawartość domyślna. Nic poza jedną pętlą i IF nie jest niemal konieczne!. A Ty rozwaliłeś na makabryczną ilość zagnieżdżonych pętli i ifów w nich. Po prostu złapać się za głowę tylko i rwać włosy.
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A kto mówił o osobnym pliku? Zobacz na strukturę jaką podałem. To wciąż jeden plik ale o nieco zmienionej strukturze drzewa XML. Plecak "wypchnąłem" poza sloty (IMG:style_emoticons/default/smile.gif) Moim zdaniem prościej potem to będzie parsować jeśli zdecydujesz się, że poszerzasz pola i zamiast 3x4 czy ile tam masz zrobisz choćby 4x5. Będziesz sprawdzał czy jakiś slot zamiast obecnego 3 ma wewnątrz jakąś strukturę z itemami, czy może lepiej wrzucić to do jednego, stałego miejsca, które jest niezależne od niej? Poza tym chyba masz sprawdzanie pojemności plecaka i nie możesz przepakowywać itemów z większego do mniejszego lub zakładania 2 plecaków? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Pacyna
post
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 27.08.2010

Ostrzeżenie: (0%)
-----


Nie mogę tego zrobić bo nie mam kodów źródłowych do całego silnika , dodatkowo byłoby to bawienie się w c++ z którym u mnie kiepsko...

Obejrzyj posta wyzej zeedytowałem go ;p
Go to the top of the page
+Quote Post
Noidea
post
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


Poczytaj sobie trochę o XPath, przydaje się do wyciągania pojedynczych wartości z XMLa: http://www.w3schools.com/XPath/xpath_intro.asp

  1. <?php
  2.  
  3. $xmlData = '<inventory>
  4. <slot slotid="1"><item id="2490"/></slot>
  5. <slot slotid="2"><item id="2129"/></slot>
  6. <slot slotid="3"><item id="1988"><inside><item id="2546" count="200" /></inside></item></slot>
  7. <slot slotid="4"><item id="2463"/></slot>
  8. <slot slotid="5"><item id="2423"/></slot>
  9. <slot slotid="6"><item id="2525"/></slot>
  10. <slot slotid="7"><item id="2468"/></slot>
  11. <slot slotid="8"><item id="2643"/></slot>
  12. <slot slotid="9"><item id="2164"/></slot>
  13. <slot slotid="10"><item id="2165"/></slot>
  14. </inventory>';
  15.  
  16. $slotsOrder = array( 2, 1, 3, 6, 4, 5, 9, 7, 10, -1, 8, -1 );
  17.  
  18.  
  19. $i = 0;
  20. $inventory = new SimpleXMLElement( $xmlData );
  21.  
  22. echo '<table>';
  23. for( $row = 0; $row < 4; $row++ )
  24. {
  25. echo '<tr>';
  26.  
  27. for( $col = 0; $col < 3; $col++ )
  28. {
  29. echo '<td>';
  30.  
  31. $slotID = $slotsOrder[$i];
  32. $slotItemIDs = $inventory->xpath( '/inventory/slot[@slotid=' . $slotID . ']/item/@id' );
  33.  
  34. if( $slotItemIDs )
  35. {
  36. $itemID = (string)$slotItemIDs[0];
  37. echo $itemID;
  38. }
  39.  
  40. $i++;
  41. echo '</td>';
  42. }
  43.  
  44. echo '</tr>';
  45. }
  46. echo '</table>';
  47.  
  48. ?>



Popraw sobie też rozmieszczanie slotów w tabelce. Bo to co napisałem z tymi -1 jest dosyć toporne (IMG:style_emoticons/default/smile.gif)



@thek gdzieś na dole:
nie obrażę (IMG:style_emoticons/default/smile.gif)

Ten post edytował Noidea 27.08.2010, 15:20:49
Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ech... Dopóki możesz do takich maleństw używać bibliotek przewidywanych dla XML to nie ma sensu (poza wydajnościowym) to ich używaj SimpleXML choćby. Gdy to już masz: Xpath. Posłałbym całą strukturę SimpleXML do widoku i tam
/inventory/slot[@slotid = tutaj_dasz_numer_slota]/item/@id
wyciągał zawartość id itemka. Jeśli brak wyniku -> nie ma itemka w slocie albo nawet slota w strukturze, czyli wyświetlenie obrazka domyślnego (pustego).
Tyle razy wywołane ile masz slotów. A więc mniej więcej coś w stylu:
  1. $xml = simplexml_load_file("jakis.xml");
  2. $sorted_slots = array('2','1','3','6','4','5','9','7','10','fake','8','fake');
  3. foreach( $sorted_slots AS $slot ) {
  4. if($res = $xml -> xpath( '/inventory/slot[@slotid = "'.$slot.'"]/item/@id' ) ) {
  5. //item jest w slocie... obrabiamy go
  6. } else {
  7. //brak itemka lub slotu w strukturze, walimy obrazek domyślny
  8. }
  9. }
Przy dobrze zrobionym i przemyślanym CSS to bajka (IMG:style_emoticons/default/smile.gif) Wystarczy by obrazki miały stałą wysokość i szerokość w wierszach a w kontenerze, który je zawiera będą się nawzajem układały, bez potrzeby używania tabelek. Przypuśćmy, że masz obrazki po 40px x 40px i wszystkie marginy, outline wyzerowane. Ustawię sobie tylko border 1px na nie i umieszczę w divie o wielkości 3x(40px+2*1px), 4x(40px+2*1px) => 126px, 168px a nawzajem sobie popłyną (IMG:style_emoticons/default/winksmiley.jpg)
Przykład do zobaczenia sobie jak by to z użyciem css mogło wyglądać:
  1. #kontener {
  2. margin:0;
  3. padding:0;
  4. outline:0;
  5. width:126px;
  6. height:168px;
  7. border:0;
  8. background-color:red;
  9. }
  10. .image {
  11. margin:0;
  12. padding:0;
  13. outline:0;
  14. width:40px;
  15. height:40px;
  16. border:1px solid black;
  17. background-color:blue;
  18. float:left;
  19. }
  20. .clear{
  21. display:block;
  22. clear:both;
  23. }
  24. </head>
  25. <div id="kontener">
  26. <div class="image">2</div>
  27. <div class="image">1</div>
  28. <div class="image">3</div>
  29. <div class="image">6</div>
  30. <div class="image">4</div>
  31. <div class="image">5</div>
  32. <div class="image">9</div>
  33. <div class="image">7</div>
  34. <div class="image">10</div>
  35. <div class="image"></div>
  36. <div class="image">8</div>
  37. <div class="image"></div>
  38. <span class="clear"></span>
  39. </div>
  40. </html>
Żadnego kombinowania z tabelkami tu nie trzeba. Proste doklejanie kodu. Bez cudowania z zamykaniem i otwieraniem wierszy tabelki. Zrób kopiuj-wklej kodu HTML a sam zobaczysz. Połączenie zaś pętli z podanym html to na poziomie składania klocków. Więcej nie pomogę, bo to już by oznaczało, że nie potrafisz składać klocków (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




jak już tak się bawiłem to pokażę jaki kod u mnie działa (IMG:style_emoticons/default/smile.gif)
  1. <html>
  2. <head>
  3. <style>
  4. #kontener {
  5. margin:0;
  6. padding:0;
  7. outline:0;
  8. width:126px;
  9. height:168px;
  10. border:0;
  11. background-color:red;
  12. }
  13. .image {
  14. margin:0;
  15. padding:0;
  16. outline:0;
  17. width:40px;
  18. height:40px;
  19. border:1px solid black;
  20. background-color:blue;
  21. float:left;
  22. }
  23. .clear{
  24. display:block;
  25. clear:both;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div id="kontener">
  31. <?php
  32. $xmlData = '<inventory>
  33. <slot slotid="1"><item id="2490"/></slot>
  34. <slot slotid="2"><item id="2129"/></slot>
  35. <slot slotid="3"><item id="1988"><inside><item id="2546" count="200" /></inside></item></slot>
  36. <slot slotid="4"><item id="2463"/></slot>
  37. <slot slotid="5"><item id="2423"/></slot>
  38. <slot slotid="6"><item id="2525"/></slot>
  39. <slot slotid="7"><item id="2468"/></slot>
  40. <slot slotid="8"><item id="2643"/></slot>
  41. <slot slotid="9"><item id="2164"/></slot>
  42. <slot slotid="10"><item id="2165"/></slot>
  43. </inventory>';
  44.  
  45. $sorted_slots = array( 2, 1, 3, 6, 4, 5, 9, 7, 10, -1, 8, -1 );
  46. $xml = new SimpleXMLElement( $xmlData );
  47. foreach( $sorted_slots AS $slot ) {
  48. if($res = $xml -> xpath( '/inventory/slot[@slotid='.$slot.']/item/@id' ) ) {
  49. ?>
  50. <div class="image"><?php echo $slot.' '.((string)$res[0]); ?></div>
  51. <?php
  52. } else {
  53. ?>
  54. <div class="image"></div>
  55. <?php
  56. }
  57. }
  58. ?>
  59. <span class="clear"></span>
  60. </div>
  61. <body>
  62. </html>
Użyłem $xmlData kolegi Noidea, by całość można było sobie sprawdzić na własnych kompach a nie tworzyć. I pała pacyna za nieumiejętność użycia manuala. Tam pisze jak wczytywać pliki. simplexml_load_file. Masz to nawet w kodzie dla wklej.org
Powód edycji: [thek]: Mam nadzieję, że nie obrazisz się Noidea, że połączyłem oba (Twój i mój) by było ładniej?
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




EDIT: Jeśli na konkretnych pozycjach mają być konkretne obrazki "puste", to warto w ELSE rozważyć zamiast gołego
<div class="image"></div>
użycie
  1. switch( $slot ) {
  2. case 1:
  3. echo '<div class="image slot1"></div>';
  4. break;
  5. case 2:
  6. echo '<div class="image slot1"></div>';
  7. break;
  8. // i tak dalej do numerów jakie chcesz
  9. default:
  10. echo '<div class="image"></div>';
  11. }
gdzie klasy slot1 aż do slotX będą nadawały temu divowi odpowiedni background-image.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 08:44