Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Odczyt pliku XML + coś jeszcze
Forum PHP.pl > Forum > PHP
Pacyna
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...



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

natomiast tak:



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
thek
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 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.
thek
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 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? smile.gif
Pacyna
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
Noidea
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 smile.gif



@thek gdzieś na dole:
nie obrażę smile.gif
thek
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 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ą 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 winksmiley.jpg
thek
jak już tak się bawiłem to pokażę jaki kod u mnie działa 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
thek
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.
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.