Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] - zamiana tablicy dwuwymiarowej na wielowymiarową
sunnywind
post 21.09.2007, 18:00:43
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 21.09.2007

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


Na początek - Cześć wszystkim :-)

Proszę spójrzcie na przykład poniżej:

Kod
$TemplateData[] = array('DEPTH' => 1, 'TEXT' => 'text1');
$TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text2');
$TemplateData[] = array('DEPTH' => 3, 'TEXT' => 'text3');
$TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text4');
$TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text5');
$TemplateData[] = array('DEPTH' => 3, 'TEXT' => 'text6');
$TemplateData[] = array('DEPTH' => 1, 'TEXT' => 'text7');
$TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text8');
$TemplateData[] = array('DEPTH' => 3, 'TEXT' => 'text9');
$TemplateData[] = array('DEPTH' => 1, 'TEXT' => 'text10');
$TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text11');
$TemplateData[] = array('DEPTH' => 1, 'TEXT' => 'text12');
$TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text13');
$TemplateData[] = array('DEPTH' => 3, 'TEXT' => 'text14');

for ($i = 0, $Count = count($TemplateData); $i < $Count; $i++)
{
    switch ($TemplateData[$i]['DEPTH'])
    {
        case 1:
            $TemplateToJSON[] = array(
                'text'            => $TemplateData[$i]['TEXT'],
                'cls' => 'option',
                'leaf' => 'false');
            $ParentId    = array(count($TemplateToJSON)-1);
            break;
        case 2:
            $TemplateToJSON[$ParentId[0]][] = array(
                'text'            => $TemplateData[$i]['TEXT'],
                'cls' => 'option',
                'leaf' => 'false');
            $ParentId    = array($ParentId[0], count($TemplateToJSON[$ParentId[0]])-4);
// minus 4 jest dlatego że count liczy od 1 + mamy już trzy elementy: text, cls, leaf
            break;
        case 3:
            $TemplateToJSON[$ParentId[0]][$ParentId[1]][] = array(
                'text'            => $TemplateData[$i]['TEXT'],
                'cls' => 'option',
                'leaf' => 'false');
            $ParentId    = array(count($TemplateToJSON)-1, count($TemplateToJSON[$ParentId[0]])-4);
            break;
    }
}

echo '<pre>';
print_r($TemplateToJSON);
echo '</pre>';


mam taką sytuację, że tych poziomów może być 15 a nawet więcej, a nie chcę dopisywać kolejnych case'ów tylko wrzucić przetwarzanie tego przez jakąś funkcję rekurencyjną, pętelki etc... wymiękłem przy tym po 1,5h dłubania bez efektu... Efektem natomiast ma być tablica wielowymiarowa która na każdym poziomie ma elementy 'text', 'cls', 'leaf' + dowolną ilość zagnieżdzonych tablic, które jeśli są to też mają wcześniejsze elementy + ewentualnie kolejne zagnieżdzone tablice.

Kolejne elementy tablice w $TemplateData mają DEPTH zawsze takie samo, mniejsze (o dowolną różnicę) lub większe ale w tym wypadku DEPTH może mieć wartość większą tylko o jeden.

Powyższy kod zwraca i obsługuje tylko 3 poziomy - byłbym wdzięczny jakby ktoś wrzucił przemyślany opis algorytmu, albo jeszcze lepiej jakichś przykład jak obsłużyć większą ilość poziomów (szukam uniwersalnego rozwiązania -> proszę nie wrzucajcie odpowiedzi z wiekszą ilością casów).

Z góry dzięki za pomoc :-)
Sunnywind
Go to the top of the page
+Quote Post
zimi
post 21.09.2007, 19:48:03
Post #2





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


wprawdzie na forum nie daję się gotowców...
ale ostatnio lubię zabawy z przepisywaniem referencji w tablicach wielowymiarowych smile.gif
  1. <?php
  2. $TemplateData[] = array('DEPTH' => 1, 'TEXT' => 'text1');
  3. $TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text2');
  4. $TemplateData[] = array('DEPTH' => 3, 'TEXT' => 'text3');
  5. $TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text4');
  6. $TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text5');
  7. $TemplateData[] = array('DEPTH' => 3, 'TEXT' => 'text6');
  8. $TemplateData[] = array('DEPTH' => 1, 'TEXT' => 'text7');
  9. $TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text8');
  10. $TemplateData[] = array('DEPTH' => 3, 'TEXT' => 'text9');
  11. $TemplateData[] = array('DEPTH' => 1, 'TEXT' => 'text10');
  12. $TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text11');
  13. $TemplateData[] = array('DEPTH' => 1, 'TEXT' => 'text12');
  14. $TemplateData[] = array('DEPTH' => 2, 'TEXT' => 'text13');
  15. $TemplateData[] = array('DEPTH' => 3, 'TEXT' => 'text14');
  16.  
  17. $TemplateToJSON = array();
  18. $path = array();
  19. foreach($TemplateData as $array)
  20. {
  21. $ref = &$TemplateToJSON;
  22. $path = array_slice($path, 0, --$array['DEPTH']);
  23. for($i=0; $i<$array['DEPTH'];$i++)
  24. {
  25. $ref = & $ref[$path[$i]];
  26. }
  27. $ref[] = array('text'=>$array['TEXT'], 'cls' => 'option', 'leaf' => 'false');
  28. end($ref);
  29. $path[] = key($ref);
  30. }
  31. echo '<pre>';
  32. print_r($TemplateToJSON);
  33. echo '</pre>';
  34. ?>

zresztą lepiej napisać taki króciutki kod, niż opis algorytmu który pisać skończyłbym jutro popołudniu biggrin.gif:P
Go to the top of the page
+Quote Post
.radex
post 22.09.2007, 08:20:59
Post #3





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


można też napisać funkcję rekurencyjną...


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
sunnywind
post 29.09.2007, 20:39:25
Post #4





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 21.09.2007

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


Wielkie dzięki zimi :-)

Szkoda, że nie można przyznawać punktów za pomoc/rozwiązania na forum - dostałbyś za to rozwiązanie 10/10 (przed chwilą... spędziłem pół godziny na nadrabianie braków w obszarze referencji żeby zrozumieć jak to działa i ... udało się ;^ )

Jeszcze raz ogromne dziękuję
Sunnywind
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: 19.07.2025 - 04:13