我有一个这样的数组:
$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>
答案 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)
在具有此结构的表中也很有用: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个数组
company = array( array('company_id', 'company_name'))
handset = array( array('phone_id','company_id', array('color_ids'), 'phone_name')
color = array( array('color_id', 'color_name'))
size = array( array('size_id', 'size_val')
我所做的是在数组中实现数据库设计。现在你有了一些东西可以互相联系。
这是一个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()