2011-05-22 19 views
2

我有一个这样的数组:集群项目由作者的名字

[1] "John", "content1" 
[2] "John", "content2" 
[3] "John", "content3" 
[4] "Jim", "content" 
[5] "Joana", "content1" 
[6] "Joana", "content2" 

我试图有一个这样的输出:

<ul> 

<li>John 
    <ul> 
    <li> content 1 </li> 
    <li> content 2 </li> 
    <li> content 3 </li> 
    </ul> 
</li> 

<li>Jim 
    <ul> 
    <li> content </li> 
    </ul> 
</li> 

<li>Joana 
    <ul> 
    <li> content 1 </li> 
    <li> content 2 </li> 
    </ul> 
</li> 

</ul> 

我试图解决它使用foreach-迭代,但它并没有在所有的工作了: (注:$ cur_name意味着作者的名字,而$内容意味着内容)

foreach($array as $a) { 
       $cur_name = $a['name']; 
    if ($old_name != $cur_name && $cur_name !="")$return .= "<li>"; 
    if ($old_name != $cur_name && $cur_name !="") { 
     $return .= "<strong>$cur_name</strong><br />"; 
    } 
    elseif($cur_name == "") { 
    } 
    elseif ($old_name == $cur_name) { 
    } 
    $return .= "$content<br />"; 
    if ($old_name != $cur_name && $cur_name !="") $return .= "</li>"; 

    $old_name = $cur_name; 

    } 
} 

任何想法highliy感激..

+0

任何机会,你可以改变数组结构? – 2011-05-22 23:23:43

回答

2

使用此代码:

做这样的事情:

  • 迭代阵列,并且创建另一个key -ed阵列(比如$processedArray),其中从第一个指数拍摄的每张阵列上键值
  • 在每次迭代中,将2st索引添加到适当的第一个键。
  • 之后,重复此$processedArray以适当地输出它。

我知道,阅读代码会更容易些,所以,试试这个:

<?php 
$data = array(
    array('name'=>'John', 'content'=>'Content1'), 
    array('name'=>'John', 'content'=>'Content2'), 
    array('name'=>'John', 'content'=>'Content3'), 
    array('name'=>'Jim', 'content'=>'Content'), 
    array('name'=>'Joana', 'content'=>'Content1'), 
    array('name'=>'Joana', 'content'=>'Content2'), 
); 

$processedArray = array(); 

foreach($data as $each) 
{ 
    if(!isset($processedArray[ $each[ 'name' ] ])) 
     $processedArray[ $each[ 'name' ] ] = array(); 
    $processedArray[ $each[ 'name' ] ][] = $each[ 'content' ]; 
} 

echo "<ul>\n"; 

foreach($processedArray as $key => $arrVal) 
{ 
    echo " <li>$key\n"; 
    echo " <ul>\n"; 
    foreach($arrVal as $value) 
    { 
     echo "  <li>$value</li>\n"; 
    } 
    echo " </ul>\n"; 
    echo " </li>\n"; 
} 
echo "</ul>\n"; 
?> 
+0

是的,这种方法很好 - 非常感谢你! – cukabeka 2011-05-24 17:57:54

0

通过你发布什么情况来看,我认为数据的模样:

$array = array(); 
$array[1] = array("name" => "John", "content" => "content1"); 
$array[2] = array("name" => "John", "content" => "content2"); 
$array[3] = array("name" =>"John", "content" =>"content3");  
$array[4] = array("name" =>"Jim", "content" =>"content"); 
$array[5] = array("name" =>"Joana", "content" =>"content1"); 
$array[6] = array("name" =>"Joana", "content" =>"content2"); 

如果是这样的话,你唯一缺少的是$return .= "$content<br />"; 应该看起来像$return.=$a['content']."<br/>"。此外,你的代码最后还有一个额外的大括号,但我认为这只是从复制/粘贴。当然,你需要回显$ return变量。

0

下面是一些基本的代码,会为你做它:

<ul> 
<?php 
$array = array(
       array( name => 'John', 
         content => 'content1'), 
       array( name => 'John', 
         content => 'content2'), 
       array( name => 'John', 
         content => 'content3'), 
       array( name => 'Jim', 
         content => 'content'), 
       array( name => 'Joana', 
         content => 'content1'), 
       array( name => 'Joana', 
         content => 'content2') 
); 
foreach($array as $a) { 
    if ($a['name'] != $old_name) { 
     if (isset($old_name)) $return .= "\t\t</ul>\n\t</li>\n"; 
     $return .= "\t<li><strong>" . $a['name'] . "</strong>\n\t\t<ul>\n"; 
    } 
    $return .= "\t\t\t<li>" . $a['content'] . "</li>\n"; 
    $old_name = $a['name']; 
} 
echo "$return\t\t</ul>\n\t</li>\n"; 
?> 
</ul> 
+0

谢谢,但这没有得到我有效的HTML列表。 – cukabeka 2011-05-24 17:57:10

+0

它应该现在生成正确的列表。 – Midas 2011-05-24 18:05:04