前の質問に基づいて、各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
。下部の位置もこの方法で決定されます。