-1

サンプルデータがあります:

mobile(id, name, os)
      (1, "samsung 1", "android")
      (2, "samsung 2", "android")
      (3, "iPhone 3", "OS")
      (4, "iPhone 4", "OS")
      (5, "samsung 3", "android")

そしてクエリ:

$db =& JFactory::getDBO(); 
$query = "SELECT id, name, os
          FROM `mobile` order by os";
$db->setQuery($query);        
$rows = $db->loadObjectList(); 
$i=0;
$data = array();
foreach ($rows as $row) {
    if(empty($data[$row->os])) {
        $data[$row->os] = array();
    }
    if(empty($data[$row->os][$row->name])) {
        $data[$row->os][$row->name] = array();
    }
    $data[$row->os][$row->name] = $row->id;
}
<?php foreach ($data as $os => $names) {?>
<li>
    <?php echo $os; ?>
    <ul>
        <?php
        foreach ($names as $name => $id) {
            ?>
            <li>
                <?php echo $name; ?>
            </li>
            <?php
        }
        ?>
    </ul>
</li>               
<?php $i++; }?>

コードを実行すると、結果が表示されません:

android
-samsung 1
-samsung 2
-samsung 3
OS
-iPhone 3
-iPhone 4

修正方法は?

4

2 に答える 2

0
$data[$row->os][$row->name] = $row->id

する必要があります

$data[$row->os][$row->id] = $row->name

(それに応じて以下を変更)

;で上書き$data["android"]["Samsung"]し続けます。1, 2, 3, 4繰り返し可能な名前ではなく、ID などの一意のものでインデックスを作成します。

編集:$data[$row->os][$row->id]配列になるように初期化するのを見ますが、その値を$row->name;で上書きします。そして、あなたはそれをループしません。だから駄目です。これも 1 つの方法ですが、不要なループが増えるため、効率が低下します。

于 2012-06-15T08:27:35.197 に答える
0

これを変える:

$data[$row->os][$row->name] = $row->id;

これに:

$data[$row->os][$row->name][] = $row->id;

1 つ目は、配列を 1 つの項目に置き換えます。2 番目は項目を配列にプッシュします。

于 2012-06-15T09:17:10.317 に答える