Dựa trên câu hỏi trước của bạn, mỗi ustartlocation
là duy nhất (do đó, tại sao bạn có thể sử dụng nó làm chỉ mục trong $devices
của mình mảng). Sử dụng cùng một khái niệm này, bạn có thể điền vào $devices
mảng từ "ustartlocation
thành (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'];
}
}
Bởi vì vòng lặp hiển thị của bạn đã lặp lại qua từng U
và hiển thị thiết bị được chỉ định, bạn không cần phải sửa đổi bất kỳ phần nào khác. Tuy nhiên, lưu ý là tên-thiết bị sẽ lặp lại cho mọi U
thay vì span nó. Đến span nó, chúng tôi sẽ cần làm thêm một chút công việc.
Để bắt đầu, chúng tôi chỉ có thể lưu trữ usize
trong $devices
mảng thay vì điền vào từng vị trí riêng lẻ. Ngoài ra, để tránh nhiều công việc / tính toán bổ sung sau này, chúng tôi cũng sẽ lưu trữ thiết bị "trình giữ chỗ" cho mỗi vị trí bổ sung.
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';
}
}
Tiếp theo, trong vòng lặp hiển thị, bạn sẽ kiểm tra xem vị trí hiện tại có phải là trình giữ chỗ hay không (nếu có, chỉ cần hiển thị U
và không làm gì cho thiết bị; nếu không, hãy hiển thị thiết bị hoặc 'trống rỗng'). Để đạt được hiệu ứng "span" cho từng thiết bị, chúng tôi sẽ đặt rowspan
của ô bằng với usize
của thiết bị . Nếu đó là 1
, nó sẽ là một ô duy nhất; 2
, nó sẽ kéo dài 2 hàng, v.v. (đây là lý do tại sao "không làm gì" cho thiết bị trên các hàng giữ chỗ sẽ hoạt động):
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>";
}
Vì vậy, như nó có thể thấy - đầu tiên phương pháp trên chỉ lặp lại thiết bị cho mỗi U
nó kéo dài đơn giản hơn nhiều. Tuy nhiên, phương pháp thứ hai sẽ hiển thị thân thiện với người dùng hơn. Đó là sở thích của bạn đối với phương pháp bạn muốn sử dụng và phương pháp nào bạn nghĩ sẽ dễ bảo trì hơn trong tương lai.
CẬP NHẬT (code-fix &multi-direction spanning)
Tôi không nhận ra rằng bảng của bạn đang được tạo theo thứ tự giảm dần nên tôi có ustartlocation
là "vị trí trên cùng" gây ra sự thay đổi hàng / ô sai. Tôi đã sửa mã ở trên để đặt đúng "vị trí trên cùng" dựa trên ustartlocation
và usize
cho từng thiết bị sẽ khắc phục sự cố đó.
Ngoài ra, vì hướng có thể có hoặc có thể không quan trọng, tôi đã tùy chỉnh $devices
-population vòng lặp (bên dưới) để hỗ trợ tạo khoảng cách hàng một trong hai lên hoặc xuống, hoàn toàn tùy thuộc vào cờ bạn chỉ định. Mã duy nhất bạn cần thay đổi (nếu bạn đã có vòng lặp hiển thị tùy chỉnh từ trên) sẽ là while
vòng lặp điền $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';
}
}
}
Khối mã mới này sẽ, nếu usize
kéo dài hơn 1, xác định "ô trên cùng" và "ô dưới cùng" cho thiết bị hiện tại. Nếu bạn đang kéo dài từ lên trên , ô trên cùng là ustartlocation + usize - 1
; nếu bạn đang kéo dài xuống dưới , nó chỉ đơn giản là ustartlocation
. Vị trí dưới cùng cũng được xác định theo cách này.