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>';
$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