Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zamiana string na tablicę wielowymiarową
Forum PHP.pl > Forum > PHP
radziopoke
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ć?
Crozin
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.
radziopoke
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?
Crozin
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
radziopoke
dzięki za pomoc 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ć tongue.gif
stroju
a jeśli chciałbym teraz wygenerowaną tablicę ponownie zamienić w ciąg takich samych znaków to jak się za to zabraćquestionmark.gif
Crozin
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).
stroju
no własnie próbuję sobie coś takiego stworzyć ale nie do końca mi to wychodzi.. napiszesz jakiś prosty przykład??
Crozin
Pokaż co zrobiłeś do tej pory - najlepiej SSCCE.
stroju
  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
Crozin
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.
stroju
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..
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.