Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]{JSON] Tworzenie tablicy JSON - problem
Forum PHP.pl > Forum > PHP
Gatzu
Witam. Mam taki problem z którym nie potrafię sobie poradzić. Mam dostarczane w kolekcji informacje na temat sklepów (adres, data otwarcia itp) Potrzebuje zapisać to do tablicy a następnie za pomocą jsonEncode wygenerować takiego JSON'a
  1. [
  2. {
  3. "city": "Wroclaw",
  4. "data": [
  5. {
  6. "id": "#",
  7. "name": "Zlote tarasy",
  8. "city": "Wroclaw",
  9. "post_code": "50-545",
  10. "street": "Ko\u015bciuszki",
  11. "house_no": "2",
  12. "flat_no": "4",
  13. "opening_hours": "8:00 - 16:00",
  14. "latitude": 52.2330649,
  15. "longitude": 20.9207689,
  16. "description": "Opis sklepu"
  17. },
  18. {
  19. "id": "#",
  20. "name": "Arkadia",
  21. "city": "Wroclaw",
  22. "post_code": "50-545",
  23. "street": "Ko\u015bciuszki",
  24. "house_no": "2",
  25. "flat_no": "4",
  26. "opening_hours": "8:00 - 16:00",
  27. "latitude": 52.2571437,
  28. "longitude": 20.9822873,
  29. "description": "Opis sklepu"
  30. }
  31. ]
  32. }]

Tutaj moja metoda tworzenia tablicy:
  1. public function getCollectionAsArray()
  2. {
  3. $stores = $this->getStoreCollection();
  4.  
  5. $jsonArray = array();
  6.  
  7. foreach ($stores as $store) {
  8.  
  9. $jsonArray[] = array(
  10. 'city' => $store->getCity(),
  11. 'data' => array(
  12. [
  13. 'id' => $store->getIdentifier(),
  14. 'name' => $store->getName(),
  15. 'post_code' => $store->getPostCode(),
  16. 'street' => $store->getStreet(),
  17. 'house_no' => $store->getHouseNo(),
  18. 'flat_no' => $store->getFlatNo(),
  19. 'latitude' => $store->getLatitude(),
  20. 'longitude' => $store->getLongitude(),
  21. 'description' => $store->getDescription()
  22. ],
  23. ),
  24. );
  25. }
  26.  
  27. return $jsonArray;
  28. }

Całość działa z wyjątkiem jednej rzeczy, a mianowicie w przypadku kilku sklepów w tym samym mieście, zamiast dodać nowe dane do pola 'data' dodaje całkiem nowy klucz z nowym miastem:
  1. array (size=4)
  2. 0 =>
  3. array (size=2)
  4. 'city' => string 'Wrocław' (length=8)
  5. 'data' =>
  6. array (size=1)
  7. 0 =>
  8. array (size=9)
  9. ...
  10. 1 =>
  11. array (size=2)
  12. 'city' => string 'Wrocław' (length=8)
  13. 'data' =>
  14. array (size=1)
  15. 0 =>
  16. array (size=9)


Próbowałem już kombinować z array_merge i array_push ale bezskutecznie. Bardzo proszę o pomoc smile.gif
Wazniak96
Jest tak bo w tablicy stores masz też dane zapisane rekord po rekordzie a nie zgrupowane według miasta. W kodzie nie sprawdzasz czy dane miasto już było i wtedy dopisujesz dane tylko sztywno dodajesz rekord po rekordzie do tablicy.(Wiem... rekord to chyba nie za dobre określenie ale nic mi nie przychodzi do głowy haha.gif )

Kod pisany z palca tak łopatologicznie. Sprawdź czy wszystko ok jest.
  1.  
  2. function getCollectionAsArray()
  3. {
  4. $stores = $this->getStoreCollection();
  5.  
  6. $jsonArray = array();
  7.  
  8. foreach ($stores as $store) {
  9. $pom = cityInArray($store->getCity(), $jsonArray);
  10. if($pom === false)
  11. {
  12. $jsonArray[] = array(
  13. 'city' => $store->getCity(),
  14. 'data' => array(
  15. [
  16. 'id' => $store->getIdentifier(),
  17. 'name' => $store->getName(),
  18. 'post_code' => $store->getPostCode(),
  19. 'street' => $store->getStreet(),
  20. 'house_no' => $store->getHouseNo(),
  21. 'flat_no' => $store->getFlatNo(),
  22. 'latitude' => $store->getLatitude(),
  23. 'longitude' => $store->getLongitude(),
  24. 'description' => $store->getDescription()
  25. ],
  26. ),
  27. );
  28. }
  29. else
  30. {
  31. $jsonArray[$pom]['data'][] =
  32. [
  33. 'id' => $store->getIdentifier(),
  34. 'name' => $store->getName(),
  35. 'post_code' => $store->getPostCode(),
  36. 'street' => $store->getStreet(),
  37. 'house_no' => $store->getHouseNo(),
  38. 'flat_no' => $store->getFlatNo(),
  39. 'latitude' => $store->getLatitude(),
  40. 'longitude' => $store->getLongitude(),
  41. 'description' => $store->getDescription()
  42. ]
  43. }
  44. }
  45.  
  46. return $jsonArray;
  47. }
  48.  
  49. function cityInArray($city, $jsonArray)
  50. {
  51. $ct = count($jsonArray);
  52. for($i=0; $i<$ct; $i++)
  53. {
  54. if($jsonArray[$i]['city'] == $city)
  55. return $i;
  56. }
  57. return false;
  58.  
  59. }


PS: Zdecyduj się czy korzystasz z array() czy z [] wink.gif

EDIT:
Można też, żeby ominąć tą dodatkową funkcję i używania pętli(czas czas czas...) stworzyć sobie pomocniczą tablicę zawierającą miasta, które się już pojawiły i wtedy można bez problemu skorzystać z funkcji in_array
Gatzu
Super, dzięki za odpowiedź. Twoje rozwiązanie jest dobre i jestem w ten sposób bliżej niż dalej końca, ale wciąż nie działa to do końca dobrze smile.gif Problemy występują z nawiasami i klamrami po stronie JSONA (w sensie są tam gdzie ich nie powinno być). Całość ma współgrać z mapką Google i dostałem takie wytyczne odnośnie zwracanego JSONa. Dlatego raz było array a innym razem [], bo wystarczy gdzieś o jeden nawias za dużo albo za mało i całość się sypie smile.gif
maly_swd
array() i [] jest tym samym smile.gif http://php.net/manual/en/language.types.array.php chyba od 5.4

[] to nie to samo co {} - klamry z "wąsem" oznaczają obiekt!

Obiekt tworzysz przez new stdClass();


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.