0

簡潔な PHP 型コードで次の問題に対する簡単な解決策を提供してください (PHP 型構文に大まかに従う必要があるだけです)。

アイテムのネストされたリストを出力できるようにしたいと考えています。リスト内のアイテムは、リスト内の他のアイテムのサブアイテムにすることができます。単純な SQL テーブルには、次のフィールドがあります。

  1. itemID – int.
  2. アイテム – varchar。
  3. subItemOfID – int.

データの小さなサブセットは次のようになります。

itemID  item    subItemOfID
1   Item1   0
2   Item2   0
3   Item3   0
4   Item10  1
5   Item11  1
6   Item12  1
7   Item100 4
8   Item101 4
9   Item102 4
10  Item30  3
11  Item31  3
12  Item32  3

出力は次のようになります (項目ごとに並べ替えられたネストされたリスト)。

•   Item1
    o       Item10
           Item100
           Item101
           Item102
    o       Item11
    o       Item12
•   Item2
•   Item3
    o       Item30
    o       Item31
    o       Item32

SubItemOfID 行が降順である場合にこれを取得しますが、使用した前の例ではアイテムに正規表現が含まれていましたが、varchar が変更される可能性があるため、これはテーブルで何かを行うには悪い方法であると常に言われていました。私は助けが必要です!これは私がこれまでに持っているものです:

<?php
$table = array (
'itemID' => array( 
                    1,2,3,4,5,6,7,8,9,10,11,12
                ),
'item' => array(
                    'Item1','Item2','Item3','Item10','Item11','Item12','Item100','Item101','Item102','Item30','Item31','Item32'
                ),
'subItemOfID' => array(
                    0,0,0,1,1,1,4,4,4,3,3,3
                )
                );

foreach($table as $header => $column) {
    foreach($column as $data) {
        if($header == 'item') {
            $fixed = intval(str_replace('Item','',$data));      
            $str_len = strlen($fixed);
            echo '<ul>';
            if($str_len === 1) {
                echo '<li>'.$data.'</li>';
            }
            echo '<ul>';
            if($str_len === 2  ) {
                echo '<li>'.$data.'</li>';              
            }
            echo'<ul>';
            if($str_len ===3) {
                echo '<li>'.$data.'</li>';
            }
            echo '</ul>';
            echo '</ul>';
            echo '</ul>';       
        }
    }
}
?>
enter code here
4

1 に答える 1

0

このクエリを使用すると、最大 6 つのレベルのカテゴリを取得できます。

$sql = "SELECT c1.item AS item,
              IF(c6.item IS NOT NULL, 6,
                  IF(c5.item IS NOT NULL, 5,
                     IF(c4.item IS NOT NULL, 4,
                        IF(c3.item IS NOT NULL, 3,
                           IF(c2.item IS NOT NULL, 2, 1))))) AS lvl,
              if (c6.item IS NOT NULL, CONCAT(c6.itemId, c5.itemId, c4.itemId, c3.itemId, c2.itemId, c1.itemId),
                  IF(c5.item IS NOT NULL, CONCAT(c5.itemId, c4.itemId, c3.itemId, c2.itemId, c1.itemId),
                     IF(c4.item IS NOT NULL, CONCAT(c4.itemId, c3.itemId, c2.itemId, c1.itemId),
                        IF(c3.item IS NOT NULL, CONCAT(c3.itemId, c2.itemId, c1.itemId),
                           IF(c2.item IS NOT NULL, CONCAT(c2.itemId, c1.itemId), c1.itemId))))) AS code,
       FROM categories c1
       LEFT JOIN categories c2 ON c2.itemId = c1.subItemOfID
       LEFT JOIN categories c3 ON c3.itemId = c2.subItemOfID
       LEFT JOIN categories c4 ON c4.itemId = c3.subItemOfID
       LEFT JOIN categories c5 ON c5.itemId = c4.subItemOfID
       LEFT JOIN categories c6 ON c6.itemId = c5.subItemOfID
       GROUP BY c1.itemId
       ORDER BY code";
$q = mysql_query($sql);
while (false !== ($row = mysql_fetch_assoc($q))) {
    echo str_repeat('---', $row['lvl'])
       . $row['title']
       . '<br />';
}

機能: すべてのカテゴリとその親カテゴリ (存在する場合) を選択し、コード フィールドを生成して並べ替えます。

すみません、質問を読み飛ばしてしまいました。

PHPでの解決策は次のとおりです。

$table = array (
    'itemID' => array(
        1,2,3,4,5,6,7,8,9,10,11,12
    ),
    'item' => array(
        'Item1','Item2','Item3','Item10','Item11','Item12','Item100','Item101','Item102','Item30','Item31','Item32'
    ),
    'subItemOfID' => array(
        0,0,0,1,1,1,4,4,4,3,3,3
    )
);
outputChildrenRecursive(0, $table);

/**
 * Outputs child items recursively
 *
 * @param integer $parentItemID Parent item itemID
 * @param array   $table        Table data
 */
function outputChildrenRecursive($parentItemID, array $table)
{
    // Get children
    $children = array();
    foreach ($table['itemID'] as $key => $value) {
        if ($table['subItemOfID'][$key] == $parentItemID) {
            $children[] = $key;
        }
    }

    // Output children and grandchildren
    if (!empty($children)) {
        echo '<ul>';
        foreach ($children as $childKey) {
            echo '<li>';
            echo $table['item'][$childKey];
            // Prevent infinite recursion if itemID equals subItemOfID
            if ($table['itemID'][$childKey] != $table['subItemOfID'][$childKey]) {
                outputChildrenRecursive($table['itemID'][$childKey], $table);
            }
            echo '</li>';
        }
        echo '</ul>';
    }
}
于 2012-10-24T19:39:53.170 に答える