php将数组更改为包含父项的ul

时间:2012-06-24 06:56:02

标签: php html domdocument

我有一个这样的数组:

$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>

3 个答案:

答案 0 :(得分:1)

这个问题没有那么现实的答案。但是,我得到了解决方案。你必须使用嵌套的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";
?>

答案 1 :(得分: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 :(得分:1)

阵列中没有可以构建正确功能的模式。

即(从我能推断的内容)
array('1', '0', 'nokia') stores in it ('id_number', 'number', 'company name')
array('11', '10', 'black') stores ('id_number', 'number', 'colour')

也没有什么可以将'nokia'与'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')
  5. 我所做的是在数组中实现数据库设计。现在你有了一些东西可以互相联系。

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

    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
    这将是工作流程 li每个company列表
    li ever handset其中company_id是in_array()
    每个color可用的li由in_array()过滤 li每个size可用in_array()

    过滤