sql >> データベース >  >> RDS >> Mysql

行番号と一致するかどうかに基づいて、HTMLテーブル番号の行にデータを入力するにはどうすればよいですか?

    前の質問に基づいて、各ustartlocation は一意です(したがって、$devicesのインデックスとして使用できるのはなぜですか 配列)。これと同じ概念を使用して、$devicesにデータを入力できます。 「ustartlocationからの配列 (ustartlocation + (usize - 1))へ "。

    $devices = array();
    while($row = mysql_fetch_array($result_devices)) {
        $endLocation = ($row['ustartlocation'] + ($row['usize'] - 1));
        for ($location = $row['ustartlocation']; $location <= $endLocation; $location++) {
            $devices[$location] = $row['devicename'];
        }
    }
    

    表示ループはすでに各Uを繰り返し処理しているためです 割り当てられたデバイスが表示されます。他の部分を変更する必要はありません。ただし、これに対する注意点は、デバイス名が繰り返されるということです。 すべてのU spanの代わりに それ。 スパン それなら、もう少し作業が必要です。

    まず、usizeを保存するだけです。 $devicesで 個々の位置を埋める代わりに配列。また、後で多くの余分な作業や計算を防ぐために、追加の位置ごとに「プレースホルダー」デバイスも保存します。

    while($row = mysql_fetch_array($result_devices)) {
        // get the "top" location for the current device
        $topLocation = ($row['ustartlocation'] + $row['usize'] - 1);
    
        // populate the real position
        $devices[$topLocation] = $row;
    
        // generate a list of "placeholder" positions
        for ($location = ($topLocation - 1); $location >= $row['ustartlocation']; $location--) {
            $devices[$location] = 'placeholder';
        }
    }
    

    次に、表示ループで、現在の位置がプレースホルダーであるかどうかを確認します(プレースホルダーの場合は、Uを表示するだけです。 デバイスには何もしません。そうでない場合は、デバイスを表示するか、「空」)。各デバイスの「スパン」効果を実現するために、セルのrowspanを設定します。 デバイスのusizeと同じ 。 1の場合 、単一のセルになります。 2 、2行にまたがるなど(これが、プレースホルダー行のデバイスに対して「何もしない」ことが機能する理由です):

    for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {   
        $u = $cabinets_sqlrow[2] - $i;
        echo "<tr>";
        echo '<td width="15px" align="right">' . $u . '</td>';
        if (isset($devices[$u])) {
            // we have a "device" here; if it's a "placeholder", do nothing!
            if ($devices[$u] != 'placeholder') {
                echo '<td width="150px" align="middle" rowspan="' . $devices[$u]['usize'] . '">' . $devices[$u]['devicename'] . '</td>';
            }
        } else {
            echo '<td width="150px" align="middle">empty</td>';
        }
        echo "</tr>";
    }
    

    ご覧のとおり、最初の 上記の方法では、Uごとにデバイスを繰り返すだけです。 スパンははるかに簡単です。ただし、2番目の方法では、よりユーザーフレンドリーな表示が表示されます。どの方法を使用したいか、そしてどの方法が将来より保守しやすくなると思うかはあなたの好みです。

    更新 (コード修正と多方向スパニング)
    テーブルが降順で作成されていることに気づかなかったので、ustartlocationを使用しました 誤った行/セルシフトを引き起こした「最上位の場所」として。上記のコードを修正して、ustartlocationに基づいて「最上位の場所」を適切に設定しました およびusize その問題を修正するデバイスごとに。

    または、方向が重要な場合と重要でない場合があるため、$devicesをカスタマイズしました -ループ(下)にデータを入力して、どちらかになる行スパンの作成をサポートします。 指定したフラグに完全に応じて、上向きまたは下向きになります。変更する必要がある唯一のコード(上記のカスタマイズされた表示ループがある場合)は、whileです。 $devicesにデータを取り込むループ :

    $spanDevicesUpwards = true;
    while($row = mysql_fetch_array($result_devices)) {
        if ($row['usize'] == 1) {
            $devices[$row['ustartlocation']] = $row;
        } else {
            $topLocation = ($spanDevicesUpwards ? ($row['ustartlocation'] + $row['usize'] - 1) : $row['ustartlocation']);
            $bottomLocation = ($spanDevicesUpwards ? $row['ustartlocation'] : ($row['ustartlocation'] - $row['usize'] + 1));
    
            $devices[$topLocation] = $row;
            for ($location = ($topLocation - 1); $location >= $bottomLocation; $location--) {
                $devices[$location] = 'placeholder';
            }
        }
    }
    

    この新しいコードブロックは、usizeの場合、 1を超えるスパンで、現在のデバイスの「トップセル」と「ボトムセル」を決定します。 上向きにまたがっている場合 、最上位のセルはustartlocation + usize - 1です。; 下向きにまたがっている場合 、それは単にustartlocation 。下部の位置もこの方法で決定されます。



    1. SQL Server 2016:テーブルを作成する

    2. AndroidでListViewを使用してSQLiteデータベースを読み取って更新する方法は?

    3. postgresql日時に日数を追加する方法

    4. R12.2のデータモデルの論理ビュー