Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: array('a','b','c') => $arr['a']['b']['c']
Forum PHP.pl > Forum > PHP
rogeros
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.
wookieb
  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?
rogeros
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.
siatkarzyna
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. ?>
wookieb
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
rogeros
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.
wrzasq
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.
rogeros
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

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.