There is an array, inside each element of the array there is a groupId, some elements of the array have children. How to get this kind of output:
<div class="parentCategory"> <p>Japanese kitchen</p> <div class="childCategory"> <a class="hasChilds" href="#">Sushi</a> <div class="childrenCategory"> <p>Hot Sushi</p> <p>Vegan Sushi</p> </div> <a href="#">Rolls</a> <a href="#">Onigiri</a> </div> </div>
Parent category in array:
[75] => Array ( [groupName] => Japanese kitchen [groupId] => 100001 [hasChilds] => 1 )
Children category in array:
[76] => Array ( [groupName] => Sushi [groupId] => 101705 [hasChilds] => 1 [parentGroupId] => 100001 )
I was able to only return parent categories, how to link child categories, in turn I could not figure out how
<? foreach($getGroup['Groups'] as $echoGroup) { if($echoGroup['hasChilds'] != null) { echo '<li class="parent"><a href="#">' . $echoGroup['groupName'] . '</li>'; } } ?>
Advertisement
Answer
I’ve been thinking about for a rather long time and I think I would do it using 2 functions. So here’s the whole code, I also changed the initial array (added a few more items to check functions workability).
First of all, I create an array where groupId is a key. I if the initial array’s key values are important, then we’ll need to do the other logics, but if not (and I suppose they are not matter), then my suggestion is to create array whith subarrays named “ChildrenArray” where we put all children elements.
- List item
Check it out:
<?php function AssembleMenu($arrayToAssemble){ $prepArray=array(); foreach($arrayToAssemble as $groupId=>$itemArr){ if(isset($itemArr['parentGroupId']) && $itemArr['parentGroupId'] !=''){ $prepArray=CheckAndSetChildren($arrayToAssemble, $itemArr); $arrayToAssemble=$prepArray; }else{ } } return($arrayToAssemble); } function CheckAndSetChildren($whereToCheck, $WhatToCheck){ if(array_key_exists($WhatToCheck['parentGroupId'], $whereToCheck)){ if(!isset($whereToCheck[$WhatToCheck['parentGroupId']]['ChildrenArray'])){ $whereToCheck[$WhatToCheck['parentGroupId']]['ChildrenArray']=array(); } $whereToCheck[$WhatToCheck['parentGroupId']]['ChildrenArray'][$WhatToCheck['groupId']]=$WhatToCheck; if(array_key_exists($WhatToCheck['groupId'], $whereToCheck)){ unset($whereToCheck[$WhatToCheck['groupId']]); } }else{ foreach($whereToCheck as $groupId=>$itemArr){ if(isset($itemArr['ChildrenArray'])){ $whereToCheck[$groupId]['ChildrenArray']=CheckAndSetChildren($itemArr['ChildrenArray'], $WhatToCheck); } } if(array_key_exists($WhatToCheck['groupId'], $whereToCheck)){ unset($whereToCheck[$WhatToCheck['groupId']]); } } return($whereToCheck); } $testArray=array( 73 => array ( 'groupName' => 'Lapshichechka', 'groupId' => 100011, 'hasChildren' => 1, 'parentGroupId' => 101708 ), 75 => array ( 'groupName' => 'Japanese kitchen', 'groupId' => 100001, 'hasChildren' => 1 ), 76 => array ( 'groupName'=> 'Sushi', 'groupId' => 101705, 'hasChildren' => 1, 'parentGroupId' => 100001 ), 77 => array ( 'groupName'=> 'Rolls', 'groupId' => 101706, 'hasChildren' => 0, 'parentGroupId' => 101705 ), 78 => array ( 'groupName'=> 'RolledRice', 'groupId' => 101707, 'hasChildren' => 0, 'parentGroupId' => 101705 ), 79 => array ( 'groupName'=> 'Italian Kitchen', 'groupId' => 101708, 'hasChildren' => 0, ), ); $preAssembledArray=array(); $assembledArray=array(); // creating array with groupId as key foreach($testArray as $arrayId=>$itemProps){ $preAssembledArray[$itemProps['groupId']]=$itemProps; } $assembledArray=AssembleMenu($preAssembledArray); echo('<br >$assembledArray==<br/ ><br/ >'); print_r($assembledArray); ?>