Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> array('a','b','c') => $arr['a']['b']['c'], niby proste ale mam chwilowy brak pomysłów
rogeros
post 30.01.2009, 13:30:23
Post #1





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 10.04.2002
Skąd: Pruszków

Ostrzeżenie: (10%)
X----


Witajcie.
Mam dynamiczną tablice która zawiera w sobie zmienna ilość wartości.
np:

$nazwa="voipsklep.pl";
$tablica=array('a','b','c','d','e','f');

i z tej tablicy chciałbym zrobić tablicę wielowymiarową tak
aby kolejny element tablicy $tablica był kolejnym "wymiarem" nowej tablic.
Nie wiem jak to fachowo nazwać. ale wynik chciałbym taki

$nowa_tablica=array("a"=>
array("b"=>
array("c"=>
......
array("f"=>$nazwa)

to było przedstawienie obrazowe. w skrócie chodzi mi o:
$nowa_tablica['a']['b']['c']['d']['e']['f']=$nazwa;


Próbowałem na różne sposoby ale niestety nie mam pomysłów na rozwiązanie tego problemu.
Za pomoc wszystkim z góry dziękuje.


--------------------
Centrale telefoniczne VOIP - www.astrocom.pl
VOIP
Go to the top of the page
+Quote Post
wookieb
post 30.01.2009, 13:58:07
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. <?php
  2. $nazwa='test';
  3. $tab=array('a','b','c','d','e','f');
  4. $newTab=array();
  5.  
  6. $lastTab=&$newTab;
  7. foreach($tab as $num=>$key)
  8. {
  9.    $lastTab[$key]=array();
  10.    $lastTab=&$lastTab[$key];
  11.    
  12.    if(($num+1)==count($tab)) $lastTab=$nazwa;
  13. }
  14. ?>

Ale czemu chcesz to zrobic tak?

Ten post edytował wookieb 30.01.2009, 14:19:00


--------------------
Go to the top of the page
+Quote Post
rogeros
post 30.01.2009, 14:15:18
Post #3





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 10.04.2002
Skąd: Pruszków

Ostrzeżenie: (10%)
X----


Cytat(wookieb @ 30.01.2009, 13:58:07 ) *
Ale czemu chcesz to zrobic tak?


Dziękuje za pomoc. Już sprawdzam jak Twoje rozwiązanie działa.
Dlaczego tak robię.

Otóż muszę stworzyć plik xml z tablicy php. do tego mam odpowienią klasę i z tym nie ma problemu.
xml generuje drzewko katalogów (przy generowaniu nie wiemy ile będzie podkatalogów a w nich kolejnych podkatalagów a w nich [...])


i to własnie jest do generowania struktury podkatalogów.


--------------------
Centrale telefoniczne VOIP - www.astrocom.pl
VOIP
Go to the top of the page
+Quote Post
siatkarzyna
post 30.01.2009, 14:16:23
Post #4





Grupa: Zarejestrowani
Postów: 85
Pomógł: 4
Dołączył: 1.07.2008

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


Można też tak jeśli o to chodzi

  1. <?php
  2. $nazwa="voipsklep.pl";
  3. $tablica = array('a','b','c','d','e','f');
  4.  
  5. $nr = count($tablica);
  6.  
  7. for ($i=0; $i<=$nr - 1; $i++) {
  8.  
  9. $nowa[$tablica[$i]] = $nazwa;
  10.  
  11. }
  12.  
  13.  
  14. echo "<pre>";
  15. print_r ($nowa);
  16. echo "</pre>";
  17. ?>


--------------------
Space Studio
Go to the top of the page
+Quote Post
wookieb
post 30.01.2009, 14:17:27
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(rogeros @ 30.01.2009, 14:15:18 ) *
i to własnie jest do generowania struktury podkatalogów.


Aha to dobrze. Pytam bo wole wiedzieć czy to nie jest jakiś kolejny "genialny" pomysł programistyczny smile.gif
Mój przykład jest sprawdzony. Działa

Ten post edytował wookieb 30.01.2009, 14:18:38


--------------------
Go to the top of the page
+Quote Post
rogeros
post 30.01.2009, 15:02:53
Post #6





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 10.04.2002
Skąd: Pruszków

Ostrzeżenie: (10%)
X----


nie jednak nie poradziłem sobie z problemem.
rozwiązanie kolegi wookieb jest bardzo dobrym rozwiązaniem
ale działa na referencjach i nie potrafię tego przystosować do swoich potrzeb.

ponieważ wyciągam kilka wpisów z bazy danych to tablice te mi mieszają uzywajac array_merge.

Otóż wygląda to tak:

mam takie wpisy w bazie danych:
Kod
id_kat     id_rodzic             nazwa
1               0                         telefony voip         
2               0|1                         linksysy     
3               0|1                         polycom          
4               0                         bramki voip     
5               0|4                         atcom          
6               0|4|5                     at1          
7               0|4|5|6                    Nowa kategoria     6     
8               0|4|5                     at2     
9               0|4                               d-link     
10               0                                  routery voip

wybaczcie za formatowanie tesktu. ale nie wiedziałem jak to tu wstawić ładnie

id_kat - to normalnie id danego katalogu
id_rodzic - jest to drzewko id_kat aby dojsc do danego podkatalogu

np: 0|4|5|6 - nowa kategoria 6
0 - katalog glowny.
4 - w katalogu glownym jest katalog bramki voip o id 4
5 - w katalogu bramki voip (4) znajduje sie katalog atcom o id 5
6 - w atcom znajduje sie at1 o id 6
-- i w tym katalogu jest nasz katalog "nowa kategoria 6" ktore ma id 7


i teraz muszę stworzyć z tego tablicę odwzorowującą katalogi

$tablica[0]="telefony voip";
$tablica[0][1]="linksys";
$tablica[0][2]='polycom';
$tablica[1]="bramki voip";
$tablica[1][1]="atcom";
$tablica[1][2][1]="at1";
$tablica[1][2][1][1]='nowa kategoria';


już nie wiem sam czy dobrze myślę.

Chciałbym zrobić te kategorie i ich hierarchię w jednej tablicy php.

Ten post edytował rogeros 30.01.2009, 15:20:19


--------------------
Centrale telefoniczne VOIP - www.astrocom.pl
VOIP
Go to the top of the page
+Quote Post
wrzasq
post 30.01.2009, 16:05:32
Post #7





Grupa: Zarejestrowani
Postów: 206
Pomógł: 18
Dołączył: 6.03.2006
Skąd: Szczecin

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


jesli wychodzi ci cos takiego:

  1. <?php
  2. $tablica[0]="telefony voip";
  3. $tablica[0][1]="linksys";
  4. ?>


to na pewno zle myslisz winksmiley.jpg. musisz sobie w takim wypadku rozgraniczac na kazdym poziomie [0]['name'] i [0]['children'], [0]['children'][1]['name], [0]['children'][1]['children']...

ewentualnie mozesz sobie zrobic klase i przeciazyc metody interfejsu ArrayAccess aby wykrywac, czy zapisujesz cos glebiej, czy bezposrednio na danym poziomie.

a jakim problemem sa tutaj referencje? nie bardzo rozumiem jaki jest problem w tym, ze wookieb uzyl referencji - nawet jak ich nie rozumiesz, to tymbardziej - nie dotykaj i tyle. dal gotowe rozwiazanie.


--------------------
Go to the top of the page
+Quote Post
rogeros
post 3.02.2009, 09:00:29
Post #8





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 10.04.2002
Skąd: Pruszków

Ostrzeżenie: (10%)
X----


Udało mi się rozwiązać problem za wielką zasługą kolegi wookieb.
Bardzo mi pomógł. Chwała mu za to. Dzięki wookieb.

A oto rozwiązanie może się komuś przyda.

dane wejściowe z bazy danych

  1. INSERT INTO `katalogi` (`id_kat`, `id_rodzic`, `nazwa`) VALUES
  2. (1, '0', 'telefony voip'),
  3. (2, '0|1', 'linksys'),
  4. (3, '0|1', 'polycom'),
  5. (4, '0', 'bramki voip'),
  6. (5, '0|4', 'atcom'),
  7. (6, '0|4|5', 'at1'),
  8. (7, '0|4|5|6', 'Nowa kategoria'),
  9. (8, '0|4|5', 'at2'),
  10. (9, '0|4', 'd-link'),
  11. (10, '0', 'routery voip');



na początku wyciągamy dane z bazy i wrzucamy je do tablicy
  1. <?php
  2. $wynik=mysql_query(&#092;"select * from katalogi\");
  3. $ilosc_wynikow=mysql_num_rows($wynik);
  4. for($i=0;$i<$ilosc_wynikow;$i++){
  5.    $baza=mysql_fetch_assoc($wynik);
  6.    $temp=explode(&#092;"|\",$baza[id_rodzic]);
  7.    $dane[]=array(&#092;"id\"=>$baza[id_kat],\"parent\"=>array_pop($temp),\"name\"=>$baza[nazwa]);
  8.  
  9. }
  10. ?>



następnie z danych z bazy tworzymy tablicę z katalogami i podkatalogami za pomocą funkcji

  1. <?php
  2. function createTree(&$arr, $parent=0)
  3. {
  4.    $tree=array();
  5.    foreach($arr as $key=>$el)
  6.    {
  7.        if($el['parent']==$parent)
  8.        {
  9.            $el['childs']=createTree($arr, $el['id']);
  10.            if(count($el['childs'])==0) unset($arr[$key]);
  11.            $tree[]=$el;
  12.        }
  13.    }
  14.    return $tree;
  15. }
  16. ?>



dzięki tej funkcji otrzymujemy tablicę w postaci drzewka z z katalogami i podkatalogami (w podkatalogach kolejne podkatalogi a w nich kolejne itd)


teraz zostało nam z takiej tablicy utworzyć xml-a. do tego użyjemy kolejnej funkcji

  1. <?php
  2. function createXml($arr, $tabs=0)
  3. {
  4.    $str='';
  5.    foreach($arr as $el)
  6.    {
  7.        
  8.        $str.=str_repeat(&#092;"\t\", $tabs).''.\"\n\";
  9.        $str.=createXml($el['childs'], $tabs+1);
  10.        $str.=str_repeat(&#092;"\t\", $tabs).''.\"\n\";
  11.    }
  12.    return $str;
  13. }
  14. ?>


i dzięki temu otrzymujemy piękny gotowy plik xml

  1. <item name="telefony voip" id="1">
  2.      <item name="polycom" id="3">
  3.      </item>
  4.      <item name="linksys" id="2">
  5.      </item>
  6. </item>
  7. <item name="bramki voip" id="4">
  8.      <item name="d-link" id="9">
  9.      </item>
  10.      <item name="atcom" id="5">
  11.            <item name="at2" id="8">
  12.            </item>
  13.            <item name="at1" id="6">
  14.                  <item name="Nowa kategoria" id="7">
  15.                  </item>
  16.            </item>
  17.      </item>
  18. </item>
  19. <item name="routery voip" id="10">
  20. </item>



i to wszystko.

pozdrawiam i jeszcze raz dziękuje wookieb.



Do administratorów. Przez pomyłkę utworzyłem nowy post zamiast odpowiedzieć na swój własny. bardzo proszę scalić tego posta z tematem Temat: arrayand39aand39and39band39and39cand39__arrand39aand39and39band39and39cand39.


// zrobione
// ayeo



Ten post edytował ayeo 3.02.2009, 09:27:20


--------------------
Centrale telefoniczne VOIP - www.astrocom.pl
VOIP
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2025 - 22:10