2013-04-01 32 views
0

MySQL查詢是讓我這個數組對象(簡稱位)對象數組的值無序列表:PHP充滿

Array 
(
    [0] => stdClass Object 
     (
      [parentTitle] => Winner 2009 
      [catTitle] => Max Muster 
      [title] => drm202 
     ) 

    [1] => stdClass Object 
     (
      [parentTitle] => Winner 2009 
      [catTitle] => Max Muster 
      [title] => drm202 
     ) 

    [2] => stdClass Object 
     (
      [parentTitle] => Winner 2011 
      [catTitle] => Josh Frank 
      [title] => A bird in the cage 
     ) 

    [3] => stdClass Object 
     (
      [parentTitle] => Winner 2011 
      [catTitle] => Josh Frank 
      [title] => cue & repeat 
     ) 
    ... 
) 

怎麼可能建立一個無序的HTML列表出來這個數組的哪看起來是這樣的:

<ul id="content"> 

    <li>Winner 2009 
     <ul> 
      <li>Max Muster 
      <ul> 
        <li>drm202</li> 
      </ul> 
      </li> 
     </ul> 
    </li> 

    <li>Winner 2011 
     <ul> 
      <li>Josh Frank 
      <ul> 
        <li>A bird in the cage</li> 
        <li>cue & repeat</li> 
      </ul> 
      </li> 
     </ul> 
    </li> 

</ul> 

前兩個對象是相同的,因此,在UL的人+標題只應在父贏家2009年從2011年的獲獎者有兩個贏家項目因此這些兩個不同的項目一旦上市應列在他的下方。

我的方法是有一個foreach循環填充數組

foreach ($results as $object) { 

    // fill array 
    $array[] = "</ul><ul><li><h2> " . $object->parentTitle . "</h2>\n</li>"; 
    $array[] = "<li><h5>" . $object->catTitle . "</h5></li>\n"; 
    $array[] = "<li> - " . $object->title . "</li>\n"; 

} 

揪出來雙打

$array = array_unique($array); 

這種方式似乎是不方便的極端與錯。

感謝您的幫助,

託尼

+0

您是不是在使用'SELECT DISTINCT parentTitle,catTitle,title'? –

回答

0

您可以使用array_walk

$source=json_decode('[{"parentTitle":"Winner 2009","catTitle":"Mas Muster","title":"drm202"},{"parentTitle":"Winner 2009","catTitle":"Mas Muster","title":"drm202"},{"parentTitle":"Winner 2011","catTitle":"Josh Frank","title":"A bird in the cage"},{"parentTitle":"Winner 2011","catTitle":"Josh Frank","title":"cue & repeat"}]'); 
$result=array(); 
array_walk($source,function($v,$i)use(&$result){ 
    if(!isset($result[$v->parentTitle])) $result[$v->parentTitle]=array(); 
    if(!isset($result[$v->parentTitle][$v->catTitle])) $result[$v->parentTitle][$v->catTitle]=array(); 
    if(!in_array($v->title,$result[$v->parentTitle][$v->catTitle])) $result[$v->parentTitle][$v->catTitle][]=$v->title; 
}); 
print_r($result); // just to debug 
echo "<ul>"; 
foreach($result as $key=>$sub){ 
    echo "<li>".htmlentities($key,ENT_COMPAT,"UTF-8"); 
    echo "<ul>"; 
    foreach($sub as $k=>$s){ 
     echo "<li>".htmlentities($k,ENT_COMPAT,"UTF-8"); 
     echo "<ul>"; 
     foreach($s as $i=>$v){ 
      echo "<li>".htmlentities($v,ENT_COMPAT,"UTF-8")."</li>"; 
     } 
     echo "</ul></li>"; 
    } 
    echo "</ul></li>"; 
} 
echo "</ul>"; 

Live demo

print_r輸出:

Array 
(
    [Winner 2009] => Array 
     (
      [Mas Muster] => Array 
       (
        [0] => drm202 
       ) 

     ) 

    [Winner 2011] => Array 
     (
      [Josh Frank] => Array 
       (
        [0] => A bird in the cage 
        [1] => cue & repeat 
       ) 

     ) 

) 

HTML輸出(不縮進):

<ul><li>Winner 2009 
<ul><li>Mas Muster 
<ul><li>drm202</li> 
</ul> 
</li></ul> 
</li><li>Winner 2011 
<ul><li>Josh Frank 
<ul><li>A bird in the cage</li> 
<li>cue &amp; repeat</li> 
</ul> 
</li></ul> 
</li></ul> 

如果你想走得更遠花哨,你可以改變foreach條款到另一個array_walkarray_reduce或類似的東西。

+0

路人!大!非常感謝這非常廣泛和有用的答案。 –

+0

嗨路人,儘管閱讀手冊我有問題了解array_walk。也許你可以再次幫助我並擴展你的代碼。假設我在每個數組對象(id,alias,catalias)中有3個更多的值,我想在內部項目列表f.e中進行訪問。

  • 籠子裏的一隻鳥
  • 。我已經改變了你的小提琴來說明是什麼意思。 http://3v4l.org/LU8e2 –

    +0

    @tBook喜歡這個:http://3v4l.org/FKcM4#v530 – Passerby