I have a dynamic multi-dimensional array that can be of any dimension here is a sample..
$array_serial = 'a:2:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:27:"products.php?la=electronics";s:6:"otitle";s:11:"Electronics";s:6:"utitle";s:11:"Electronics";s:4:"ttip";s:11:"Electronics";}s:8:"children";a:2:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:51:"products.php?la=electronics&lb=Computer-Peripherals";s:6:"otitle";s:20:"Computer Peripherals";s:6:"utitle";s:20:"Computer Peripherals";s:4:"ttip";s:34:"Electronics : Computer Peripherals";}s:8:"children";a:1:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:63:"products.php?la=electronics&lb=Computer-Peripherals&lc=Printers";s:6:"otitle";s:8:"Printers";s:6:"utitle";s:8:"Printers";s:4:"ttip";s:45:"Electronics : Computer Peripherals : Printers";}s:8:"children";a:1:{i:0;a:1:{s:2:"id";a:4:{s:3:"url";s:90:"products.php?la=electronics&lb=Computer-Peripherals&lc=Printers&ld=Single-Function-Printer";s:6:"otitle";s:23:"Single Function Printer";s:6:"utitle";s:23:"Single Function Printer";s:4:"ttip";s:71:"Electronics : Computer Peripherals : Printers : Single Function Printer";}}}}}}i:1;a:1:{s:2:"id";a:4:{s:3:"url";s:38:"products.php?la=electronics&lb=Mobiles";s:6:"otitle";s:7:"Mobiles";s:6:"utitle";s:7:"Mobiles";s:4:"ttip";s:21:"Electronics : Mobiles";}}}}i:1;a:2:{s:2:"id";a:4:{s:3:"url";s:31:"products.php?la=homenfurnitures";s:6:"otitle";s:19:"Home And Furnitures";s:6:"utitle";s:19:"Home And Furnitures";s:4:"ttip";s:19:"Home And Furnitures";}s:8:"children";a:2:{i:0;a:1:{s:2:"id";a:4:{s:3:"url";s:9:"about.php";s:6:"otitle";s:8:"About Us";s:6:"utitle";s:8:"About Us";s:4:"ttip";s:8:"About US";}}i:1;a:2:{s:2:"id";a:4:{s:3:"url";s:40:"products.php?la=homenfurnitures&lb=Other";s:6:"otitle";s:5:"Other";s:6:"utitle";s:5:"Other";s:4:"ttip";s:27:"Home And Furnitures : Other";}s:8:"children";a:1:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:51:"products.php?la=homenfurnitures&lb=Lights-AnD-Lamps";s:6:"otitle";s:14:"Lights & Lamps";s:6:"utitle";s:14:"Lights & Lamps";s:4:"ttip";s:36:"Home And Furnitures : Lights & Lamps";}s:8:"children";a:2:{i:0;a:1:{s:2:"id";a:4:{s:3:"url";s:12:"contacts.php";s:6:"otitle";s:10:"Contact Us";s:6:"utitle";s:10:"Contact Us";s:4:"ttip";s:10:"Contact US";}}i:1;a:2:{s:2:"id";a:4:{s:3:"url";s:58:"products.php?la=homenfurnitures&lb=Dinnerware-AnD-Crockery";s:6:"otitle";s:21:"Dinnerware & Crockery";s:6:"utitle";s:21:"Dinnerware & Crockery";s:4:"ttip";s:43:"Home And Furnitures : Dinnerware & Crockery";}s:8:"children";a:1:{i:0;a:1:{s:2:"id";a:4:{s:3:"url";s:78:"products.php?la=homenfurnitures&lb=Dinnerware-AnD-Crockery&lc=Cups-AnD-Saucers";s:6:"otitle";s:14:"Cups & Saucers";s:6:"utitle";s:14:"Cups & Saucers";s:4:"ttip";s:60:"Home And Furnitures : Dinnerware & Crockery : Cups & Saucers";}}}}}}}}}}}';
All index "otitle" of this array will be displayed in form in an input type text, and the user can modify this Title according to their desire. How can i acheive this in a clean way??
And this is just part of the array, the actual array can be much bigger.
Here is my code to view "otitle" in a input type
function get_menu_list($selected_menus)
{
if($selected_menus != null){
foreach($selected_menus as $menu_level_1)
{
$title = implode("///",$menu_level_1['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="text" name="otitle[]" value="'.$menu_level_1['id']['otitle'].'" />
</div>
';
if(isset($menu_level_1['children']))
{
echo '<ol class="dd-list">';
foreach($menu_level_1['children'] as $menu_level_2)
{
$title_level_2 = implode("///",$menu_level_2['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="text" name="otitle[]" value="'.$menu_level_2['id']['otitle'].'" />
</div>
';
if(isset($menu_level_2['children']))
{
echo '<ol class="dd-list">';
foreach($menu_level_2['children'] as $menu_level_3)
{
$title_level_3 = implode("///",$menu_level_3['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="text" name="otitle[]" value="'.$menu_level_3['id']['otitle'].'" />
</div>
';
if(isset($menu_level_3['children']))
{
echo '<ol class="dd-list">';
foreach($menu_level_3['children'] as $menu_level_4)
{
$title_level_4 = implode("///",$menu_level_4['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="text" name="otitle[]" value="'.$menu_level_4['id']['otitle'].'" />
</div>
';
if(isset($menu_level_4['children']))
{
echo '<ol class="dd-list">';
foreach($menu_level_4['children'] as $menu_level_5)
{
$title_level_5 = implode("///",$menu_level_5['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="text" name="otitle[]" value="'.$menu_level_5['id']['otitle'].'" />
</div>
</li>
';
}
echo "</ol>";
}
echo '</li>';
}
echo "</ol>";
}
echo '</li>';
}
echo "</ol>";
}
echo '</li>';
}
echo '</ol>';
}
echo '</li>';
}
}//end if
else
return null;
}
$array_unserial = unserialize($array_serial);
echo get_menu_list($array_unserial);
I did not used the Recursion method but since I have already written the function with using foreach loop
. And here is the code of how I accomplished this task using this same function.
if (isset($_REQUEST['u_arr'])) {
$array_serial = serialize($_REQUEST['u_arr']);
}
else {
//Here is my code to view "utitle" in a input type
$array_serial = $array_serial; /*You can get $array_serial from the question of this post*/
}
function get_menu_list($selected_menus)
{
if($selected_menus != null){
foreach($selected_menus as $id1=>$menu_level_1)
{
$title = implode("///",$menu_level_1['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="hidden" name="u_arr['.$id1.'][id][url]" value="'.$menu_level_1['id']['url'].'" />
<input type="hidden" name="u_arr['.$id1.'][id][otitle]" value="'.$menu_level_1['id']['otitle'].'" />
<input type="text" name="u_arr['.$id1.'][id][utitle]" value="'.$menu_level_1['id']['utitle'].'" />
<input type="hidden" name="u_arr['.$id1.'][id][ttip]" value="'.$menu_level_1['id']['ttip'].'" />
</div>
';
if(isset($menu_level_1['children']))
{
echo '<ol class="dd-list">';
foreach($menu_level_1['children'] as $id2=>$menu_level_2)
{
$title_level_2 = implode("///",$menu_level_2['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][id][url]" value="'.$menu_level_2['id']['url'].'" />
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][id][otitle]" value="'.$menu_level_2['id']['otitle'].'" />
<input type="text" name="u_arr['.$id1.'][children]['.$id2.'][id][utitle]" value="'.$menu_level_2['id']['utitle'].'" />
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][id][ttip]" value="'.$menu_level_2['id']['ttip'].'" />
</div>
';
if(isset($menu_level_2['children']))
{
echo '<ol class="dd-list">';
foreach($menu_level_2['children'] as $id3=>$menu_level_3)
{
$title_level_3 = implode("///",$menu_level_3['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][id][url]" value="'.$menu_level_3['id']['url'].'" />
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][id][otitle]" value="'.$menu_level_3['id']['otitle'].'" />
<input type="text" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][id][utitle]" value="'.$menu_level_3['id']['utitle'].'" />
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][id][ttip]" value="'.$menu_level_3['id']['ttip'].'" />
</div>
';
if(isset($menu_level_3['children']))
{
echo '<ol class="dd-list">';
foreach($menu_level_3['children'] as $id4=>$menu_level_4)
{
$title_level_4 = implode("///",$menu_level_4['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][children]['.$id4.'][id][url]" value="'.$menu_level_4['id']['url'].'" />
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][children]['.$id4.'][id][otitle]" value="'.$menu_level_4['id']['otitle'].'" />
<input type="text" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][children]['.$id4.'][id][utitle]" value="'.$menu_level_4['id']['utitle'].'" />
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][children]['.$id4.'][id][ttip]" value="'.$menu_level_4['id']['ttip'].'" />
</div>
';
if(isset($menu_level_4['children']))
{
echo '<ol class="dd-list">';
foreach($menu_level_4['children'] as $id5=>$menu_level_5)
{
$title_level_5 = implode("///",$menu_level_5['id']);
echo '
<li class="dd-item">
<div class="dd-handle">
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][children]['.$id4.'][children]['.$id5.'][id][url]" value="'.$menu_level_5['id']['url'].'" />
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][children]['.$id4.'][children]['.$id5.'][id][otitle]" value="'.$menu_level_5['id']['otitle'].'" />
<input type="text" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][children]['.$id4.'][children]['.$id5.'][id][utitle]" value="'.$menu_level_5['id']['utitle'].'" />
<input type="hidden" name="u_arr['.$id1.'][children]['.$id2.'][children]['.$id3.'][children]['.$id4.'][children]['.$id5.'][id][ttip]" value="'.$menu_level_5['id']['ttip'].'" />
</div>
</li>
';
}
echo "</ol>";
}
echo '</li>';
}
echo "</ol>";
}
echo '</li>';
}
echo "</ol>";
}
echo '</li>';
}
echo '</ol>';
}
echo '</li>';
}
}//end if
else
return null;
}
$array_unserial = unserialize($array_serial);
?>
<form method="post" action="">
<?php get_menu_list($array_unserial) ?>
<button type="submit">Submit</button>
</form>
The idea you are looking for is called Recursion. Recursion works by a named function calling itself until some variety of conditionals are met. For example, the mathematical operator ! (read: "Factorial") is one of the simplest ways to get an idea of how recursion works. A factorial is defined by starting with your given number, say 5
, and multiplying by every integer from that number until you reach 1
. So 5!
is calculated like so: 5*4*3*2*1
. In code that may look something like:
function factorial($n){
if($n<=1) return 1;
//If the number being passed is one or lower, no need to call this function again, just return 1.
return $n*factorial($n-1);
//If we got to here, the $n is not 1 or less, so we multiply $n times the answer of factorial($n-1), which will repeat until $n-1 becomes 1.
}
I found this Quora question where I thought both answers helped to explain in different ways the idea of recursion.
Now, for your question. I've commented everything I can think of, so please let me know if you don't understand anything.
<style>
div.menu-item > div.menu-item {
margin-left:1rem;
}
</style>
<?php
function get_menu_list($selected_menus,$offset_i=false)
{
foreach($selected_menus as $i=>$menu):
//the : is an alternate syntax in PHP for {}, now instead of trying to find a matching }, PHP will look for the keyword "endforeach;"
$id_string = ($offset_i===false) ? $i : $offset_i.'-'.$i;
//If the $offset_i is false, then we are calling this function directly and these are main-level elements.
//If it is not false, this function is being called from itself.
?>
<div class="menu-item">
<label for="text-<?php echo $id_string;?>"><?php echo $menu['id']['otitle'];?></label><input type="text" id="text-<?php echo $id_string?>" value="<?php print($menu['id']['utitle']);?>" />
<?php
//The code above just outputs any information you want into a 'menu-item' div. you can change literally every thing here to your liking. This was fastest for me.
/*
The code below
1. Checks if the $menu array as a key named 'children', and if that is true
2. Checks that the count (or sizeof) the array is greater than 0.
3. If it does, call get_menu_list on the children array, supplying the $id_string we created up top so that we don't have overlapping
ID names in our HTML.
*/
if(array_key_exists('children', $menu) && count($menu['children'])>0){
get_menu_list($menu['children'],$id_string);
}
?></div><?php
//Ends the HTML div we started up top.
endforeach;
//Self explanatory.
}
$array_serial = 'a:2:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:27:"products.php?la=electronics";s:6:"otitle";s:11:"Electronics";s:6:"utitle";s:11:"Electronics";s:4:"ttip";s:11:"Electronics";}s:8:"children";a:2:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:51:"products.php?la=electronics&lb=Computer-Peripherals";s:6:"otitle";s:20:"Computer Peripherals";s:6:"utitle";s:20:"Computer Peripherals";s:4:"ttip";s:34:"Electronics : Computer Peripherals";}s:8:"children";a:1:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:63:"products.php?la=electronics&lb=Computer-Peripherals&lc=Printers";s:6:"otitle";s:8:"Printers";s:6:"utitle";s:8:"Printers";s:4:"ttip";s:45:"Electronics : Computer Peripherals : Printers";}s:8:"children";a:1:{i:0;a:1:{s:2:"id";a:4:{s:3:"url";s:90:"products.php?la=electronics&lb=Computer-Peripherals&lc=Printers&ld=Single-Function-Printer";s:6:"otitle";s:23:"Single Function Printer";s:6:"utitle";s:23:"Single Function Printer";s:4:"ttip";s:71:"Electronics : Computer Peripherals : Printers : Single Function Printer";}}}}}}i:1;a:1:{s:2:"id";a:4:{s:3:"url";s:38:"products.php?la=electronics&lb=Mobiles";s:6:"otitle";s:7:"Mobiles";s:6:"utitle";s:7:"Mobiles";s:4:"ttip";s:21:"Electronics : Mobiles";}}}}i:1;a:2:{s:2:"id";a:4:{s:3:"url";s:31:"products.php?la=homenfurnitures";s:6:"otitle";s:19:"Home And Furnitures";s:6:"utitle";s:19:"Home And Furnitures";s:4:"ttip";s:19:"Home And Furnitures";}s:8:"children";a:2:{i:0;a:1:{s:2:"id";a:4:{s:3:"url";s:9:"about.php";s:6:"otitle";s:8:"About Us";s:6:"utitle";s:8:"About Us";s:4:"ttip";s:8:"About US";}}i:1;a:2:{s:2:"id";a:4:{s:3:"url";s:40:"products.php?la=homenfurnitures&lb=Other";s:6:"otitle";s:5:"Other";s:6:"utitle";s:5:"Other";s:4:"ttip";s:27:"Home And Furnitures : Other";}s:8:"children";a:1:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:51:"products.php?la=homenfurnitures&lb=Lights-AnD-Lamps";s:6:"otitle";s:14:"Lights & Lamps";s:6:"utitle";s:14:"Lights & Lamps";s:4:"ttip";s:36:"Home And Furnitures : Lights & Lamps";}s:8:"children";a:2:{i:0;a:1:{s:2:"id";a:4:{s:3:"url";s:12:"contacts.php";s:6:"otitle";s:10:"Contact Us";s:6:"utitle";s:10:"Contact Us";s:4:"ttip";s:10:"Contact US";}}i:1;a:2:{s:2:"id";a:4:{s:3:"url";s:58:"products.php?la=homenfurnitures&lb=Dinnerware-AnD-Crockery";s:6:"otitle";s:21:"Dinnerware & Crockery";s:6:"utitle";s:21:"Dinnerware & Crockery";s:4:"ttip";s:43:"Home And Furnitures : Dinnerware & Crockery";}s:8:"children";a:1:{i:0;a:1:{s:2:"id";a:4:{s:3:"url";s:78:"products.php?la=homenfurnitures&lb=Dinnerware-AnD-Crockery&lc=Cups-AnD-Saucers";s:6:"otitle";s:14:"Cups & Saucers";s:6:"utitle";s:14:"Cups & Saucers";s:4:"ttip";s:60:"Home And Furnitures : Dinnerware & Crockery : Cups & Saucers";}}}}}}}}}}}';
$array_unserial = unserialize($array_serial);
get_menu_list($array_unserial);
?>
Try to avoid using serialized strings as much as you possibly can. A very simple solution is one I already wrote out to you in the comments, but by creating a table categories
with just a few fields you can get the same set of data without having to use array serialization / deserialization. It definitely is a question outside of the topic of this particular question, but I'd feel like I wasn't being very helpful if I didn't at least mention it to you.
Hope this helps.