Berdasarkan pertanyaan Anda sebelumnya, setiap ustartlocation
unik (karenanya Anda dapat menggunakannya sebagai indeks di $devices
. Anda Himpunan). Dengan menggunakan konsep yang sama, Anda dapat mengisi $devices
larik dari "ustartlocation
ke (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'];
}
}
Karena loop tampilan Anda sudah berulang melalui setiap U
dan menampilkan perangkat yang ditetapkan, Anda tidak perlu mengubah bagian lainnya. Namun, peringatan untuk ini adalah bahwa nama perangkat akan diulang untuk setiap U
bukannya span dia. Untuk rentang itu, kita perlu melakukan sedikit lebih banyak pekerjaan.
Untuk memulai, kita cukup menyimpan usize
di $devices
array alih-alih mengisi setiap posisi individu. Selain itu, untuk mencegah banyak pekerjaan/perhitungan tambahan di kemudian hari, kami juga akan menyimpan perangkat "placeholder" untuk setiap posisi tambahan.
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';
}
}
Selanjutnya, di loop tampilan Anda, Anda akan memeriksa apakah posisi saat ini adalah placeholder atau tidak (jika demikian, cukup tampilkan U
dan tidak melakukan apa pun untuk perangkat; jika tidak, tampilkan perangkat, atau 'kosongkan'). Untuk mencapai efek "span" untuk setiap perangkat, kami akan menyetel rowspan
sel sama dengan usize
perangkat . Jika 1
, itu akan menjadi satu sel; 2
, itu akan menjangkau 2 baris, dll (inilah sebabnya "tidak melakukan apa-apa" untuk perangkat di baris-tempat penampung akan berfungsi):
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>";
}
Jadi, seperti yang bisa dilihat - yang pertama metode di atas yang hanya mengulangi perangkat untuk setiap U
itu membentang jauh lebih sederhana. Namun, cara kedua akan menghadirkan tampilan yang lebih user-friendly. Pilihan Anda adalah metode mana yang ingin Anda gunakan dan metode mana yang menurut Anda akan lebih dapat dipertahankan di masa mendatang.
PERBARUI (perbaikan kode &rentang multi-arah)
Saya tidak menyadari bahwa tabel Anda dibuat dalam urutan menurun, jadi saya memiliki ustartlocation
sebagai "lokasi teratas" yang menyebabkan pergeseran baris/sel yang salah. Saya telah memperbaiki kode di atas untuk menetapkan "lokasi teratas" dengan benar berdasarkan ustartlocation
dan usize
untuk setiap perangkat yang akan memperbaiki masalah tersebut.
Atau, karena arah mungkin atau mungkin tidak penting, saya telah menyesuaikan $devices
-populating loop (di bawah) untuk mendukung pembuatan row-span yang berjalan baik ke atas atau ke bawah, sepenuhnya tergantung pada bendera yang Anda tentukan. Satu-satunya kode yang perlu Anda ubah (jika Anda sudah memiliki loop tampilan yang disesuaikan dari atas) adalah while
loop yang mengisi $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';
}
}
}
Blok kode baru ini akan, jika usize
menjangkau lebih dari 1, tentukan "sel atas" dan "sel bawah" untuk perangkat saat ini. Jika Anda membentang ke atas , sel teratas adalah ustartlocation + usize - 1
; jika Anda merentang ke bawah , itu hanya ustartlocation
. Lokasi bawah juga ditentukan dengan cara ini.