【问题标题】:PHP: Easiest and cleanest way to modify multidimensional array?PHP:修改多维数组的最简单和最干净的方法?
【发布时间】:2017-05-29 22:03:27
【问题描述】:

我有一个可以是任意维度的动态多维数组,这里是一个示例:

$array_serial = 'a:2:{i:0;a:2:{s:2:"id";a:4:{s:3:"url";s:27:"products.php?la=电子产品";s:6:"otitle";s:11:"电子产品";s:6:"utitle";s:11:"电子产品";s:4:"ttip";s:11:"电子产品" ;}s:8:"儿童";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:"电子学:计算机外围设备";}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:"打印机";s:4:"ttip";s:45:"电子产品:计算机外围设备:打印机";}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-打印机";s:6:"otitle";s:23:"单功能打印机";s:6:"utitle";s:23:"单功能打印机";s:4:"ttip";s:71 :“电子:计算机外围设备:打印机:单功能公关inter";}}}}}}i:1;a:1:{s:2:"id";a:4:{s:3:"url";s:38:"products.php?la=电子&lb=Mobiles";s:6:"otitle";s:7:"Mobiles";s:6:"utitle";s:7:"Mobiles";s:4:"ttip";s:21:"电子产品:手机";}}}}i:1;a:2:{s:2:"id";a:4:{s:3:"url";s:31:"products.php?la= homenfurnitures";s:6:"otitle";s:19:"家居和家具";s:6:"utitle";s:19:"家居和家具";s:4:"ttip";s:19 :"家居和家具";}s:8:"儿童";a:2:{i:0;a:1:{s:2:"id";a:4:{s:3:"url" ;s:9:"about.php";s:6:"otitle";s:8:"关于我们";s:6:"utitle";s:8:"关于我们";s:4:" ttip";s:8:"关于我们";}}i:1;a:2:{s:2:"id";a:4:{s:3:"url";s:40:"产品.php?la=homenfurnitures&lb=Other";s:6:"otitle";s:5:"Other";s:6:"utitle";s:5:"Other";s:4:"ttip"; s:27:"家居和家具:其他";}s:8:"儿童";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:"灯和灯";s:4:"ttip";s:36:"家居和家具:灯和灯";}s:8:"儿童";a:2:{i: 0;a:1:{s:2:"id";a:4:{s:3:"ur l";s:12:"contacts.php";s:6:"otitle";s:10:"联系我们";s:6:"utitle";s:10:"联系我们";s:4 :"ttip";s:10:"联系我们";}}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:"家居和家具:餐具和陶器";}s:8:"儿童";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:"家居和家具:餐具和陶器: 杯子和碟子";}}}}}}}}}}';

这个数组的所有索引“otitle”都会以输入类型文本的形式显示出来,用户可以根据自己的需要修改这个Title。我怎样才能以干净的方式实现这一目标?

这只是数组的一部分,实际的数组可以更大。

这是我的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);

【问题讨论】:

  • 随机问题:为什么您的数组开始序列化?
  • @Jhecht,这只是将其放入变量中。我如何放置一个打印数组供任何人复制并在变量中使用它。正如我提到的,数组是动态的,它来自数据库。
  • 您在数据库中存储了一个序列化数组?
  • 那我应该如何在我的数据库中放一个数组..!!
  • 这真的取决于你在做什么。根据我所看到的,这些是嵌套类别,它们可以存储在带有 cat_id, parent_id, category_name 列的单独表中,或者,根据您正在运行的版本或数据库,您可以只在数据库中为该列使用 JSON 数据类型.实际上,这是一个不同的问题。

标签: php arrays multidimensional-array


【解决方案1】:

基本思路

您正在寻找的想法称为递归。递归通过一个命名函数调用自身来工作,直到满足某些条件。例如,数学运算符 !(阅读:“阶乘”)是了解递归如何工作的最简单方法之一。阶乘的定义是从给定的数字开始,比如5,然后乘以该数字中的每个整数,直到达到1。所以5! 的计算方式如下:5*4*3*2*1。在可能看起来像这样的代码中:

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.
}

我找到了this Quora question,我认为这两个答案都有助于以不同的方式解释递归的概念。

回答

现在,回答你的问题。我已经把我能想到的都评论了,所以如果你有什么不明白的地方,请告诉我。

<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);
?>

关于您的序列化数据的相关说明

尽量避免使用序列化字符串。一个非常简单的解决方案是我已经在 cmets 中写给您的解决方案,但是通过创建一个只有几个字段的表 categories,您可以获得相同的数据集,而无需使用数组序列化/反序列化。这绝对是这个特定问题的主题之外的问题,但如果我至少没有向您提及它,我会觉得我没有多大帮助。

【讨论】:

  • 嗨,Jhecht,您的帮助非常大,我肯定会使用您的代码作为参考,并且可以不加修改地使用它。但是你完全错过了我在这篇文章中问的部分。我将强调这篇文章的某些部分。 //对不起,在你给出答案之前我没有这样做。 or suggest me a new title
  • 新标题?恐怕我不明白。就像在用户输入内容之后?
【解决方案2】:

我没有使用递归方法,但因为我已经使用foreach loop 编写了函数。这是我如何使用相同的函数完成此任务的代码。

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>

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 2013-01-16
    • 2010-12-01
    • 2015-07-26
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多