0

我有一个这样的数组:

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

3 回答 3

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";
?>
于 2012-06-24T07:21:18.803 回答
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;
于 2012-06-24T07:28:37.557 回答
1

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

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

也没有任何东西可以将“诺基亚”与“n90”联系起来。你必须分开你想要的东西。使用数据库(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>"
}
}
}

在夏天,您将需要:-

了解php 中的嵌套 foreach()
了解php 中的in_array()
这将是工作流
li 每一个companylist
li 曾经的handsetcompany_id 为 in_array()
li 每一个color由 in_array()过滤的可用
li 每一个由 in_array()size 过滤的可用

于 2012-06-24T08:39:45.563 回答