Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zamiana string na tablicę wielowymiarową
radziopoke
post
Post #1





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

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


Posiadam taki ciąg znaków
Np.
  1. a:1;b:2;c:a:3;c:b:4;d:a:a:5;d:a:b:6;d:a:c:7;d:b:a:8;d:b:b:9;d:b:c:10;d:c:11;d:d:12;e:a:13;e:b:14;

I musiałbym zamienić go na tablicę wielowymiarową
  1. $t['a']=1;
  2. $t['b']=2;
  3. $t['c']['a']=3;
  4. $t['c']['b']=4;
  5. $t['d']['a']['a']=5;
  6. $t['d']['a']['b']=6;
  7. $t['d']['a']['c']=7;
  8. $t['d']['b']['a']=8;
  9. $t['d']['b']['b']=9;
  10. $t['d']['b']['c']=10;
  11. $t['d']['c']=11;
  12. $t['d']['d']=12;
  13. $t['e']['a']=13;
  14. $t['e']['b']=14;

Chodzi o to, że pobieramy cześć ciągu do średnika np a:1;
Zamieniamy na element tablicy $t['a']=1
A w przypadku kawałka ciągu d:a:a:5; powinno stworzyć element tablicy $t['d']['a']['a']=5
I w taki sposób stworzyć tą tablicę. Główkuje już ze 2 godziny ale chwilowo nic zensownego nie wymyśliłem.
Ciągi mogą być różne ale zawsze elementy rozdzielone są średnikami

Jest w stanie ktoś pomóc lub ma jakiś pomysł jak to zrobić?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Rozbijasz sobie ciąg na kolejne elementy (explode) oddzielone średnikiem.
2. Dla każdego elementu z tak otrzymanej tablicy:
2.1. Rozbijasz go względem dwukropka.
2.2. Usuwasz ostatni element tak otrzymanej tablicy zapisując sobie jego wartość (array_pop) - to jest wartość elementu.
2.3. Tworzysz sobie nową referencję do tablicy $t, przykładowo $ref.
2.4. Dla każdego elementu tablicy z punktu 2.2:
2.4.1. Jeżeli nie istnieje $ref[$element] utwórz go jako tablicę.
2.4.2. Ustaw $ref jako referencję do utworzonego powyżej elementu.
2.5. Ustaw wartość z punktu 2.2 do referencji $ref.
Go to the top of the page
+Quote Post
radziopoke
post
Post #3





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

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


no to zacząłem tworzyć funkcję pobierającą ciąg $str wg tego co napisałeś.
  1. function strtotab($str)
  2. {
  3. $t=array();
  4. $s=explode(";", $str); //rozbicie ciągu na elementy
  5. foreach($s as $value)
  6. {
  7. $val=explode(":", $value); //rozbicie ciągu za pomocą dwukropka
  8. $wartosc=array_pop($val); //pobranie wartości elementu
  9. $ref = &$t; //referencja tablicy
  10. foreach($val as $el)
  11. {
  12. if(!isset($ref[$el]))//jeżeli element nie istnieje
  13. {
  14. $ref[$el]=array();
  15. }
  16. $ref = &$t[$el]; //tworzenie referencji
  17. }
  18. $ref = $wartosc; //przypisanie wartości elementowi tablicy
  19. }
  20. return $t;
  21. }
  22.  
  23. print_r(strtotab('a:1;b:2;c:a:3;c:b:4;d:a:a:5;d:a:b:6;d:a:c:7;d:b:a:8;d:b:b:9;d:b:c:10;d:c:11;d:d:
    12;e:a:13;e:b:14;'
    ));
  24.  


wszystko było by ok gdyby nie to, że ta funkcja nic nie zwraca, a na logikę powinna zwrócić tablicę. Prawdopodobnie coś pomieszałem z referencją ale coś nie mogę tego znaleźć. Jedyne co się pokazuje to biała strona z tytułem "Nie znaleziono obiektu!". Więc w czym może być problem?
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Powinieneś pozbyć się średnika z samego końca wejściowego ciągu (trim).
2. Gdy nadpisujesz referencję $ref (linia #16) powinieneś tworzyć referencję do $ref[$el], nie $t[$el].

http://ideone.com/qZ9io

Ten post edytował Crozin 7.05.2012, 14:49:25
Go to the top of the page
+Quote Post
radziopoke
post
Post #5





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

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


dzięki za pomoc (IMG:style_emoticons/default/smile.gif) Działa tak jak powinno.
A tak na marginesie pierwszy raz używałem referencji i funkcji array_pop i trim mimo, że w php siedzę bardzo długo, no ale kiedyś ten pierwszy raz musiał być (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
stroju
post
Post #6





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


a jeśli chciałbym teraz wygenerowaną tablicę ponownie zamienić w ciąg takich samych znaków to jak się za to zabrać(IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Tworzysz sobie funkcję rekurencyjną, która zwraca tablicę, gdzie kluczowi (a.b.c.a, a.b.c.b, a.b.c.c...) odpowiada dana wartość. Taka funkcja może wykorzystywać rekurencję do obrabiania kolejnych poziomów tablicy. Pierwszym argumentem funkcji będzie tablica do przetworzenia, drugim natomiast prefix dla kluczy (czyli w tym przypadku: a, następnie a.b, po czym ostateczne a.b.c).
Go to the top of the page
+Quote Post
stroju
post
Post #8





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


no własnie próbuję sobie coś takiego stworzyć ale nie do końca mi to wychodzi.. napiszesz jakiś prosty przykład??
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Pokaż co zrobiłeś do tej pory - najlepiej SSCCE.
Go to the top of the page
+Quote Post
stroju
post
Post #10





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


  1. function tabtostr($array, $prefix = '')
  2. {
  3. $keys = array_keys($array);
  4. $key1 = array();
  5. foreach($keys as $i => $val)
  6. {
  7.  
  8.  
  9.  
  10. if(is_array($array[$val]))
  11. {
  12.  
  13. $nkey = tabtostr($array[$val], $val.":");
  14. $key1[] = $prefix.$nkey;
  15. }
  16. else
  17. {
  18. $key1[] = $prefix.$val."=".$array[$val];
  19.  
  20. }
  21.  
  22.  
  23. }
  24. return join("\n",$key1);
  25.  
  26. }


działa ok, ale gdy w którym momencie tablica ma więcej niż jeden element to zanika mi prefix, wiem że to nie trudne aby to zrobić ale nie mogę coś na to wpaść..

przy takiej tablicy to co napisałem gubi prefiksy, no bo jak ma nie gubić skoro nie za bardzo jest jak przekazać je wewnętrznym elementom..

  1. $klucze = array(
  2. 'auta' => array(
  3. 'niemieckie' => array(
  4. 'bmw' => array(
  5. 1 => 'm5',
  6. 2 => 'm3',
  7. 3 => 'z3',
  8. ),
  9. 'mercedes' => array(
  10. 1 => 's class',
  11. 2 => 'c klass'
  12. )
  13. ),
  14. 'wloskie' => array(
  15. 'pagani' => 'zonda'
  16. ),
  17. 'francuskie' => array(
  18. 'renault' => 'megane',
  19. 'peugeot' => '206'
  20. )
  21. )
  22. );


pierwszy element jest ok, każdy kolejny gubi wszystko to co było przed nim..

oto efekt:
Kod
auta:niemieckie:bmw:1=m5
bmw:2=m3
bmw:3=z3
niemieckie:mercedes:1=s class
mercedes:2=c klass
auta:wloskie:pagani=zonda
auta:francuskie:renault=megane
francuskie:peugeot=206


Ten post edytował stroju 15.08.2012, 21:56:25
Go to the top of the page
+Quote Post
Crozin
post
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Trochę przekombinowane, ale byłeś blisko:
  1. <?php
  2.  
  3. function tabToString($data, $prefix = '') {
  4. $result = array();
  5.  
  6. foreach ($data as $key => $value) {
  7. if (is_array($value)) {
  8. $t = tabToString($value, $prefix . $key . ':');
  9. $result = array_merge($result, $t);
  10. } else {
  11. $result[$prefix . $key] = $value;
  12. }
  13. }
  14.  
  15. return $result;
  16. }
Myślę, że różnice w kodzie i wyniku działania funkcji sobie samodzielnie przeanalzujesz.
Go to the top of the page
+Quote Post
stroju
post
Post #12





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


no właśnie myślałem o tym, próbowałem podobnie tyle że bez array_merge i tu chyba był mój problem znikających elementów.. przy okazji zapytam, gdzie najlepiej doskonalić właśnie takie braki?? chciałbym się wiele nauczyć tylko ciężko znaleźć źródło wiedzy..
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: 22.08.2025 - 15:57