Я получаю результат от сложного вложенного запроса, который выглядит следующим образом
Heading 1 Heading 2 Heading 3 Heading 4
--------------------------------------------------------------------------
- Total income Total contributions Total employers Employer contribution
- Total income Total contributions Total participants Other Contribution
- Total income Total contributions
- Total income Total Earnings Total dividends
- Total income Total Earnings
- Total income
- Total Expenses Total benefit payments Beniciearies payments
- Total Expenses Other Expense
- Total Expenses
Таким образом, я получаю этот набор результатов в многомерном массиве, здесь заголовок 1 является родительским для заголовка 2, а заголовок 2 является родительским для заголовка 3, а заголовок 3 является родительским для заголовка 4. (аналогично структуре вложенного меню-подменю) .
Однако проблема в том, что я хочу преобразовать его в многомерный массив parent-child с идентификаторами parent-child, который будет выглядеть примерно так
Array
(
[0] = Array
(
[id] = 0
[value] = Total Income
[parent] = -1 /*Root Node should be set to -1 */
[ttid] = 1
)
[1] = Array
(
[id] = 1
[value] = Total Expenses
[parent] = -1 /*Root Node */
[ttid] = 2
)
[2] = Array
(
[id] = 2
[value] = Total Contributions
[parent] = 0
[ttid] = 0
)
[3] = Array
(
[id] = 3
[value] = Total Earning
[parent] = 0
[ttid] = 0
)
[4] = Array
(
[id] = 4
[value] = Total Benifit Payments
[parent] = 1
[ttid] = 0
)
[5] = Array
(
[id] = 5
[value] = Other Expense
[parent] = 1
[ttid] = 0
)
[6] = Array
(
[id] = 6
[value] = Total Participants
[parent] = 2
[ttid] = 0
)
[7] = Array
(
[id] = 7
[value] = Total Dividends
[parent] = 3
[ttid] = 0
)
[8] = Array
(
[id] = 8
[value] = Benificiaries Payment
[parent] = 4
[ttid] = 0
)
[9] = Array
(
[id] = 9
[value] = Directly to Participant
[parent] = 4
[ttid] = 0
)
[10] = Array
(
[id] = 10
[value] = Other Contributions
[parent] = 6
[ttid] = 0
)
)
Для начала я начал с циклов for на каждом из заголовков, чтобы получить все незаполненные элементы, а затем провел итерации и сравнение строк для каждого заголовка, чтобы сделать сопоставление родитель-потомок.
Я знаю, что это неэффективный способ сделать это, но это работает для небольшого массива из 5 элементов. Но это приводит к ошибке «Распределенная память исчерпана» с 100 записями в многомерном массиве.
Как мне оптимизировать этот код или есть какой-то лучший подход?
$h1=array();
$h2=array();
$h3=array();
$h4=array();
for($i=0; $i < 5; ++$i)
{
$h1[$i]=$data[$i]['heading_1'];
$h2[$i]=$data[$i]['heading_2'];
$h3[$i]=$data[$i]['heading_3'];
$h4[$i]=$data[$i]['heading_4'];
}
/*Get Unique Elements, Remove Duplicates, Renumber Index */
$h1=array_values(array_unique($h1));
$pc=array(); $k=1;
/*Getting heading_1 as it is as they are root elements */
for($i=0;$i<count($h1);++$i)
{
$pc[$i]['id']=$i;
$pc[$i]['value'] = $h1[$i];
$pc[$i]['parent'] =-1;
$pc[$i]['ttid']=0;
}
/*Checking heading_1 of every row with h1 to determine parents of heading_2 */
$th2=array();
for($i=0;$i<count($pc);++$i)
{
for($j=0;$j<5;++$j)
{
if (in_array($data[$j]['heading_2'],$th2))
continue; /* Skip redundant values */
else
{
if(strcmp($data[$j]['heading_1'],$pc[$i]['value'])==0)
{
$n=count($pc);
$pc[$n]['id'] = $n;
$pc[$n]['value'] = $data[$j]['heading_2'];
$pc[$n]['parent']= $i;
$pc[$n]['ttid']=0;
$th2[$i]=$data[$j]['heading_2'];
}
}
}
}
$th3=array();
for($i=0;$i<count($pc);++$i)
{
for($j=0;$j<5;++$j)
{
if (in_array($data[$j]['heading_3'],$th3))
continue; /* Skip redundant values */
else {
if(strcmp($data[$j]['heading_2'],$pc[$i]['value'])==0)
{
$n=count($pc);
$pc[$n]['id'] = $n;
$pc[$n]['value'] = $data[$j]['heading_3'];
$pc[$n]['parent']= $i;
$pc[$n]['ttid']=0;
$th2[$i]=$data[$j]['heading_3'];
}
}
}
}
$th4=array();
for($i=0;$i<count($pc);++$i)
{
for($j=0;$j<5;++$j)
{
if (in_array($data[$j]['heading_4'],$th4))
continue;
else {
if(strcmp($data[$j]['heading_3'],$pc[$i]['value'])==0)
{
$n=count($pc);
$pc[$n]['id'] = $n;
$pc[$n]['value'] = $data[$j]['heading_4'];
$pc[$n]['parent']= $i;
$pc[$n]['ttid']=0;
$th2[$i]=$data[$j]['heading_4'];
}
}
}
}