Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mapowanie wielopoziomowych tablic
Forum PHP.pl > Forum > PHP > Object-oriented programming
pi_wo
Cześć,

Pracuje nad systemem agregującym dane pochodzące z różnych źródeł ( feed'y informacyjne klientów mojego klienta ). Z każdego źródła pobieram te same dane jednak o nieco innej strukturze. Klient zażyczył sobie możliwości sprawnego zarządzania importem - także definiowania nowych struktur dokumentów - doszedłem do momentu, w którym udało mi się ustalić ogólną charakterystykę pakietów informacji i sprowadzić je wszystkie do tablic php niezależnie od źródła (json, xml, txt, sql).

Moje pytanie:

Przypuśćmy, że konkretne źródło danych zwraca mi tablicę:

  1.  
  2. // Źródło danych X
  3.  
  4. $data = array(
  5. 'nazwa123' =>"Jakaś nazwa",
  6. 'cecha1' => "Żółty",
  7. 'cecha2' => array(
  8. 'nazwa' => "Nazwa cechy 2",
  9. 'wartosc' => "Jakaś wartość"
  10. ),
  11. 'tablica_z_danymi' => array(
  12. 1 => array() // tablice z atrybutami danych
  13. 2 => array() // tablice z atrybutami danych
  14. 3 => array() // tablice z atrybutami danych
  15. 4 => array() // tablice z atrybutami danych
  16. //.. itd itp
  17. )
  18. );


Chciałbym mieć możliwość prostego zapisu "ścieżki" do pewnych danych w mojej bazie danych w formie:

MAPA
nazwa : 'nazwa123'
kolor : 'cecha1'
baza_produktów : tablica_z_danymi => # => atrybuty

Wszystko, aby obejść problem różnej struktury w różnych źródłach danych.

czy macie na to jakiś wypracowany sposób? Tak zby można było później sięgać do tych danych:

$nazwa = $mapa['nazwa'] // gdzie $mapa['nazwa'] przechowuje 'dostęp' do odpowiedniej wartość w tablicy $data, na przykład $data['nazwa123'] dla Źródła danych X itd itp

Eval ?

Mam pustkę w głowie. Pokierujcie smile.gif Być może jest jakaś funkcja, której nie mogę skojarzyć...
Crozin
Generalnie nie jest to specjalnie trudne do rozwiązania. Czego potrzebujesz?
1. Obiektów reprezentujących dane w systemie - encje - które będą tworzone na podstawie różnych źródeł danych.
2. Zestaw obiektów odczytujących dane ze znanego im tylko źródła, implementujących wspólny interfejs.

Jakby to wyglądało w praktyce?
  1. // Tworzysz obiekt "readera" w zależności od źrodła:
  2. $reader = new XMLReader('/path/to/file'); // Jeżeli źródło to XML
  3. // $reader = new SQLReader($dbConn, 'tbl_name'); // Jeżeli źródło to baza danych
  4. // $reader = new WSReader($wsImpl, '...');
  5.  
  6. // Powiedzmy, że $reader implementuje jakiś tam interfejs definiujący metodę readAll() zwracającą wszystkie encje ze źródła
  7.  
  8. foreach ($reader->readAll() as $entity) {
  9. printf("%s ma %d attrybtów\n", $entity->getName(), $entity->getAttributes()->count());
  10. }
Implementacja poszczególnych klas powinna być oczywista.
pi_wo
Bardzo prosta i klarowna koncepcja. Ale cóż - sam bym na to wpadł pewnie za tydzień - czasem tak jest, że głowa się zagotuje i kaplica.

Dzięki ogromne za naprowadzenie !
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.