आपके पिछले प्रश्न के आधार पर, प्रत्येक 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
. के लिए अवधि . के बजाय यह। अवधि . तक यह, हमें थोड़ा और काम करने की आवश्यकता होगी।
शुरू करने के लिए, हम बस 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
. के लिए बस डिवाइस को दोहराती है यह बहुत सरल है। हालांकि, दूसरी विधि अधिक उपयोगकर्ता के अनुकूल प्रदर्शन पेश करेगी। यह आपकी प्राथमिकता है कि आप किस पद्धति का उपयोग करना चाहते हैं और कौन सा तरीका आपको लगता है कि भविष्य में अधिक रखरखाव योग्य होगा।
अपडेट करें (कोड-फिक्स और बहु-दिशा फैले हुए)
मुझे नहीं पता था कि आपकी तालिका अवरोही क्रम में बनाई जा रही थी इसलिए मेरे पास 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
है . निचला स्थान भी इस तरह से निर्धारित किया जाता है।