【问题标题】:php change array to ul with parent items [duplicate]php将数组更改为具有父项的ul [重复]
【发布时间】:2012-06-24 06:56:01
【问题描述】:

我有一个这样的数组:

$arr = array(array('1', '0', 'nokia'),
             array('2', '0', 'samsung'),
             array('3', '1', 'n90'),
             array('4', '2', 'galaxy note'),
             array('5', '2', 'galaxy nexus'),
             array('6', '3', '8GB'),
             array('7', '3', '16GB'),
             array('8', '4', '8GB'),
             array('9', '4', '16GB'),
             array('10', '4', '32GB'),
             array('11', '10', 'black'),
             array('12', '10', 'red'),
             );

我想要一个函数将其更改为此 html 代码:

<ul>
   <li id="1">nokia
      <ul>
         <li id="3">n90
            <ul>
               <li id="6">8GB</li>
               <li id="7">16GB</li>
            </ul>
         </li>
      </ul>
   </li>
   <li id="2">samsung
      <ul>
         <li id="4">galaxy note
            <ul>
               <li id="8">8GB</li>
               <li id="9">16GB</li>
               <li id="10">32GB
                  <ul>
                     <li id="11">black</li>
                     <li id="12">red</li>
                  </ul>
               </li>
            </ul>
         </li>
         <li id="5">galaxy nexus</li>
      </ul>
   </li>
</ul>

【问题讨论】:

  • 这实际上不可能以任何现实的方式......你的数组值没有关系来指示它们如何组合在一起。没有一种程序化的方式来理解“品牌名称”、“型号”和“功能”之间的区别
  • 数组的元素之间有一个关系,它的parent_id数组结构是:id,parent_id,title
  • 另外,通常当您的问题中包含“我想要..”或“我需要这个”并且您没有尝试自己解决时,您不会得到对 SO 有很大帮助。我们在这里帮助您解决您编写的代码的问题,而不是为您从头开始编写代码。
  • 我试图用数组解决,但我无法得到结果
  • 如果您从数据库中提取此信息,那么开始使用连接和组来创建更易于理解的数组结构会更好

标签: php html domdocument


【解决方案1】:

我用 PHP DOMDocument 解决了它

在具有这种结构的表中也很有用:id、parent_id、title[、其他字段]

$dom = new DOMDocument;
foreach($arr as $row){
    $node[$row[0]] = $dom->createElement('li'); // make an element
    $node[$row[0]]->setAttribute('id', $row[0]); // set id to element
    $node[$row[0]]->nodeValue = $row[2]; // set the value to element
    if(!$row[1])
        $dom->appendChild($node[$row[0]]); // append the element to dom document root
    else
        $node[$row[1]]->appendChild($node[$row[0]]); // append the element to that's parent element
    $ul = $dom->createElement('ul');
    $node[$row[0]] = $node[$row[0]]->appendChild($ul);
}

$string = '<ul>'.str_replace('<ul></ul>', '', $dom->saveHTML()).'</ul>'; // delete empty ul's
echo $string;

【讨论】:

    【解决方案2】:

    这个问题没有那么现实的答案。但是,我得到了解决方案。为此,您必须使用嵌套的 foreach。比较数组元素。可能有更简单的方法来做到这一点。这是我的解决方案

    <?
    $arr = array(array('1', '0', 'nokia'),
                 array('2', '0', 'samsung'),
                 array('3', '1', 'n90'),
                 array('4', '2', 'galaxy note'),
                 array('5', '2', 'galaxy nexus'),
                 array('6', '3', '8GB'),
                 array('7', '3', '16GB'),
                 array('8', '4', '8GB'),
                 array('9', '4', '16GB'),
                 array('10', '4', '32GB'),
                 array('11', '10', 'black'),
                 array('12', '10', 'red'),
                 );
    echo "<ul>\n";
    foreach($arr as $ar){
        if($ar[1]==0){
            echo "<li id=\"".$ar[0]."\">".$ar[2]."\n";
                echo "<ul>";
                    foreach($arr as $ar1){
                        if($ar1[1]==$ar[0]){
                            echo "<li id=\"".$ar1[0]."\">".$ar1[2]."</li>\n";
                            echo "<ul>";
                            foreach($arr as $ar2){
                                if($ar2[1]==$ar1[0]){
                                    echo "<li id=\"".$ar2[0]."\">".$ar2[2]."</li>\n";                               
                                    echo "<ul>";
                                    foreach($arr as $ar3){
                                        if($ar3[1]==$ar2[0]){
                                            echo "<li id=\"".$ar3[0]."\">".$ar3[2]."</li>\n";
                                        }
                                    }
                                    echo "</ul>";
                                }
                            }
                            echo "</ul>";
                        }
                    }
                echo "</ul>";
            echo "</li>";
        }
    }
    echo "</ul>\n";
    ?>
    

    【讨论】:

    • 红黑元素在哪里?!!
    • 我只是给了你如何做到这一点的逻辑。您可以再次在内部循环中开始另一个循环。你想让我帮你做吗?
    • 不,请阅读我的答案,请刷新此处。
    【解决方案3】:

    您的数组中没有可以构建适当函数的模式。

    即(据我所知)
    array('1', '0', 'nokia') stores in it ('id_number', 'number', 'company name')
    array('11', '10', 'black') stores ('id_number', 'number', 'colour').

    也没有什么可以将“诺基亚”与“n90”联系起来。你必须分开你想要的东西。使用 db (mysql) 或在数组中进行适当的设置。

    最好使用数据库,使用过滤器、连接等。
    如果你还想要数组,我们可以尝试做一些关系。

    这是我的看法
    将您的数组拆分为 4 个数组

    1. company = array( array('company_id', 'company_name'))
    2. handset = array( array('phone_id','company_id', array('color_ids'), 'phone_name')
    3. color = array( array('color_id', 'color_name'))
    4. size = array( array('size_id', 'size_val')

    我所做的是在数组中实现了数据库设计。现在你有一些东西可以相互联系了。

    这是一个伪代码,您可以根据它的工作流程推导出您的实际代码

    foreach(element in company)
    {
     foreach(element in nested-array-of-company-element)
      {
       echo "<li id='company_id'>'company_name'</li>"
       echo "<ul>"
    
       foreach(elements in handset)
       foreach(elements in elements-of-handset)
       if( inarray(company_id) )
        { 
        echo "<li id='phone_id'>phone_name</li>"
        echo "<ul>"
        foreach(elements in color)
         foreach(elements in elements-of-color)
         if( inarray(color_id-in-handset-array) )
         {
         echo "<li id='color_id'>color_name</li>"
         echo "<ul>"
         }
        echo "</ul>"
        echo "<ul>"
        foreach(elements in size)
         foreach(elements in elements-of-size)
         if( inarray(size_id-in-handset-array) )
         {
         echo "<li id='size_id'>size_val</li>"
         echo "<ul>"
         }
    echo "</ul>"
    }
    }
    }
    

    夏天你需要:-

    了解nesting foreach() in php
    了解in_array() in php
    这将是工作流程
    李每company列表
    li ever handset 其中 company_id 是 in_array()
    li 每个color 可用 in_array() 过滤
    li 每个size 可用 in_array() 过滤

    【讨论】:

    • 数组结构为:id, parent_id, title
    • 仍然很难获得多级关系(在您的预期输出中,有来自 samsung-> galaxynote-> size-> color 的多级)。尝试使用关联数组,这样在编写代码时会更容易可视化。 array ([id]-&gt;'12',[pid]-&gt;'10',[title]-&gt;'red').
    • 仍然最好将其拆分为不同的数组。减少歧义和其他逻辑错误的机会。它还将使您获得多对多的关系。即多个手机可以链接到一种颜色或多种颜色。随着您在其中添加更多元素,您的数组版本会变得更加复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2017-07-16
    • 1970-01-01
    • 2014-01-07
    • 2018-01-08
    • 2011-08-04
    相关资源
    最近更新 更多