0

MYSQL クエリは、このオブジェクトの配列を取得しています (少し短縮されています):

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>

最初の 2 つのオブジェクトは同じであるため、UL では、親の勝者 2009 の下に人物 + タイトルを 1 回だけリストする必要があります。2011 年の勝者には 2 つの勝者プロジェクトがあるため、これら 2 つの異なるプロジェクトは彼の下にリストする必要があります。

私のアプローチは、配列を満たす 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);

この方法は非常に不便で間違っているようです。

助けてくれてありがとう、

トニー

4

1 に答える 1

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>";

ライブデモ

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_walkまたはarray_reduceそのような句に変更できます。

于 2013-04-01T08:49:58.373 に答える