PHP के साथ POST के माध्यम से एक बहुआयामी सरणी सबमिट करना


103

मेरे पास एक php फॉर्म है जिसमें एक ज्ञात संख्या कॉलम (उदा। शीर्ष व्यास, निचला व्यास, कपड़े, रंग, मात्रा) है, लेकिन एक अज्ञात संख्या में पंक्तियां हैं, क्योंकि उपयोगकर्ता पंक्तियों को आवश्यकतानुसार जोड़ सकते हैं।

मैंने पाया है कि प्रत्येक फ़ील्ड (कॉलम) को कैसे लें और उन्हें अपने स्वयं के एक सरणी में रखें।

<input name="topdiameter['+current+']" type="text" id="topdiameter'+current+'" size="5" />
<input name="bottomdiameter['+current+']" type="text" id="bottomdiameter'+current+'" size="5" />

तो मैं HTML में क्या करता हूं:

<tr>
  <td><input name="topdiameter[0]" type="text" id="topdiameter0" size="5" /></td>
  <td><input name="bottomdiameter[0]" type="text" id="bottomdiameter0" size="5" /></td>
</tr>
<tr>
  <td><input name="topdiameter[1]" type="text" id="topdiameter1" size="5" /></td>
  <td><input name="bottomdiameter[1]" type="text" id="bottomdiameter1" size="5" /></td>
</tr>

...and so on.

अब मैं क्या करना चाहूंगा सभी पंक्तियों और स्तंभों को एक बहुआयामी सरणी में डाल दिया और उस सामग्री को ग्राहक को ईमेल करें (अधिमानतः एक अच्छी तरह से स्वरूपित तालिका में)। मैं वास्तव में समझ नहीं पा रहा हूं कि उन सभी इनपुटों को कैसे संयोजित किया जाए और एक अच्छी सरणी में चयन किया जाए।

इस बिंदु पर, मुझे कई 1D सरणियों का उपयोग करने की कोशिश करनी होगी, हालांकि मुझे लगता है कि एक एकल 2D सरणी का उपयोग करना कई 1D सरणियों का उपयोग करने से बेहतर अभ्यास होगा।

जवाबों:


149

सबमिट करने पर, आपको एक एरे मिलेगा जैसे कि इस तरह बनाया जाता है:

$_POST['topdiameter'] = array( 'first value', 'second value' );
$_POST['bottomdiameter'] = array( 'first value', 'second value' );

हालाँकि, मैं आपके प्रारूप के नाम को इस प्रारूप में बदलने का सुझाव दूंगा:

name="diameters[0][top]"
name="diameters[0][bottom]"
name="diameters[1][top]"
name="diameters[1][bottom]"
...

उस प्रारूप का उपयोग करते हुए, मूल्यों के माध्यम से लूप करना बहुत आसान है।

if ( isset( $_POST['diameters'] ) )
{
    echo '<table>';
    foreach ( $_POST['diameters'] as $diam )
    {
        // here you have access to $diam['top'] and $diam['bottom']
        echo '<tr>';
        echo '  <td>', $diam['top'], '</td>';
        echo '  <td>', $diam['bottom'], '</td>';
        echo '</tr>';
    }
    echo '</table>';
}

धन्यवाद! मैं इसके करीब होना शुरू हो गया, हालांकि मेरे पास कॉलम और पंक्तियाँ थीं।
Fireflight

कैसे के बारे में अगर आप पाठ फ़ील्ड क्लोन कर रहे हैं और सूची में नाम जोड़ने के लिए कोई नियंत्रण नहीं है जैसे name="diameters[0][top]कि अगर मेरे पास एक से अधिक नाम हैं तो मैं क्या कर सकता हूं? ऊपर, नीचे, बाएँ और दाएँ जैसे? @DisgruntledGoat
JMASTER B

@JMASTERB देर से जोड़ते हैं, लेकिन आपको JS के साथ कुछ प्रोसेसिंग को जोड़ना होगा, अर्थात यदि वे क्रम में हैं, तो आप क्लोनिंग के बाद पिछले इनपुट नाम को पढ़ेंगे, और क्लोन में प्रत्येक इनपुट नाम विशेषता के लिए मैन्युअल रूप से 1 की वृद्धि।
डैनियल

16

आप इस तरह के नामकरण के साथ सभी मापदंडों को प्रस्तुत कर सकते हैं:

params[0][topdiameter]
params[0][bottomdiameter]
params[1][topdiameter]
params[1][bottomdiameter]

फिर बाद में आप कुछ इस तरह से करें:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}

0

मैंने एक ऐसा फंक्शन बनाया, जो एरेट्स के साथ-साथ सिंगल GET या POST वैल्यूज़ को हैंडल करता है

function subVal($varName, $default=NULL,$isArray=FALSE ){ // $isArray toggles between (multi)array or single mode

    $retVal = "";
    $retArray = array();

    if($isArray) {
        if(isset($_POST[$varName])) {
            foreach ( $_POST[$varName] as $var ) {  // multidimensional POST array elements
                $retArray[]=$var;
            }
        }
        $retVal=$retArray;
    }

    elseif (isset($_POST[$varName]) )  {  // simple POST array element
        $retVal = $_POST[$varName];
    }

    else {
        if (isset($_GET[$varName]) ) {
            $retVal = $_GET[$varName];    // simple GET array element
        }
        else {
            $retVal = $default;
        }
    }

    return $retVal;

}

उदाहरण:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.