2011-05-22 21 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