PHP foreach मूल सरणी मानों को परिवर्तित करता है


143

मैं बहु आयामी सरणियों में बहुत नया हूं, और यह मुझे बड़ा समय दे रहा है।

मेरी सरणी निम्नानुसार है:

$fields = array(
    "names" => array(
         "type"         => "text",
         "class"        => "name",
         "name"         => "name",
         "text_before"  => "name",
         "value"        => "",
         "required"     => true,
    )
)

तब मुझे एक फंक्शन की जाँच मिली कि क्या इन इनपुट्स को भरना है, यदि वे आवश्यक हैं।

function checkForm($fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

अब मेरी समस्या यह लाइन है

$fields[$field]['value'] = "Some error";

मैं मूल सरणी की सामग्री को बदलना चाहता हूं, क्योंकि मैं इसे वापस कर रहा हूं, लेकिन मुझे अपने फ़ॉरच लूप में वर्तमान सरणी (इस उदाहरण में नाम) का नाम कैसे मिलता है?



1
कोई फर्क नहीं पड़ता कि आप कितने नए हैं (या इस्तेमाल किया जा रहा है) - यह वह चीज है जिसे आप पीएचपी डॉक्यूमेंटेशन से पढ़ सकते हैं: php.net/manual/en/control-structures.foreach.php
निकोले इवानोव

जवाबों:


261

PHP में, संदर्भ से गुजर रहा है ( &) ... विवादास्पद है। मैं इसका उपयोग नहीं करने की सलाह देता हूं जब तक कि आपको पता न हो कि आपको इसकी आवश्यकता क्यों है और परिणामों का परीक्षण करें।

मैं निम्नलिखित करने की सलाह दूंगा:

foreach ($fields as $key => $field) {
    if ($field['required'] && strlen($_POST[$field['name']]) <= 0) {
        $fields[$key]['value'] = "Some error";
    }
}

इसलिए मूल रूप से $fieldतब उपयोग करें जब आपको मूल्यों की आवश्यकता हो, और $fields[$key]जब आपको डेटा बदलने की आवश्यकता हो।


अच्छा है, यह काम करता है! कुछ इस तरह की कोशिश की, लेकिन मुझे लगता है कि मैं कुछ जगह खराब कर दिया :) अब मैं एक हजार बार अपने उदाहरण का उपयोग करेंगे और कभी नहीं भूल सकता! :)
जेपी

खुशी है कि यह मदद की। इसके अलावा, मैं मेरे द्वारा लिंक किए गए लेख को पढ़ने की सलाह देता हूं, और foreach के लिए आधिकारिक दस्तावेज भी ( php.net/manual/ro/control-structures.foreach.php )
व्लाद

4
नीचे पंक्ति: यदि आप सरणी / चर को बदलने जा रहे हैं - तो आपको एक संदर्भ का उपयोग करना चाहिए। यह तेज, क्लीनर और अधिक पठनीय है।
लुलु

2
मैं उत्सुक हूं कि संदर्भ में foreachविवादास्पद होने से क्यों गुजरना चाहिए? यह ऐसा नहीं है कि यह छिपे हुए साइड इफेक्ट्स या कुछ भी के साथ एक फ़ंक्शन कॉल है।
UnaAlby

1
आपको यह कहने के लिए धन्यवाद कि "संदर्भ से गुजरना (और) ... विवादास्पद है" के बजाय "संदर्भ से नहीं गुजरता" या "संदर्भ से गुजरना बुराई है"। एक लौ युद्ध शुरू होने की संभावना कम है। :)
बीन

163

उपयोग करें &:

foreach($arr as &$value)
{
     $value = $newVal;
}

&एक संदर्भ के रूप में सरणी का मान पारित करता है और चर का एक नया उदाहरण नहीं बनाता है। इस प्रकार यदि आप संदर्भ बदलते हैं तो मूल मूल्य बदल जाएगा।

http://php.net/manual/en/language.references.pass.php

संपादित करें 2018
यह उत्तर इंटरनेट पर बहुत सारे लोगों द्वारा पसंद किया गया है, यही कारण है कि मैंने अधिक जानकारी और सावधानी के शब्दों को जोड़ने का फैसला किया।
जबकि foreach(या फ़ंक्शंस) के संदर्भ में पास एक साफ और छोटा समाधान है, कई शुरुआती लोगों के लिए यह एक खतरनाक नुकसान हो सकता है।

  1. PHP में लूप्स का अपना दायरा नहीं है। - @ मर्क अमेरी

    यह एक गंभीर समस्या हो सकती है जब चर एक ही दायरे में पुन: उपयोग किए जा रहे हों। एक और एसओ सवाल अच्छी तरह से दिखाता है कि क्यों एक समस्या हो सकती है।

  2. जैसा कि foreach PHP 5 में आंतरिक सरणी सूचक पर निर्भर करता है, इसे लूप के भीतर बदलने से अप्रत्याशित व्यवहार हो सकता है। - फॉर्च्यूनर के लिए PHP डॉक्स

    एक ही लूप पर पुनरावृत्ति के दौरान एक रिकॉर्ड को बदलना या हैश मान (कुंजी) को बदलना, PHP में संभावित रूप से अप्रत्याशित व्यवहार को जन्म दे सकता है। 7. यह मुद्दा और भी जटिल हो जाता है जब सरणी स्वयं एक संदर्भ है।

  3. प्रदर्शन प्रदर्शन।
    सामान्य तौर पर PHP पसंद कॉपी-ऑन-राइट फीचर के कारण मूल्य से गुजरती है। इसका मतलब है कि आंतरिक रूप से PHP एक डुप्लिकेट डेटा नहीं बनाएगा जब तक कि उसकी कॉपी को बदलने की आवश्यकता न हो। यह बहस योग्य है कि क्या संदर्भ से गुजरने से foreachप्रदर्शन में सुधार होगा। जैसा कि यह हमेशा होता है, आपको अपने विशिष्ट परिदृश्य का परीक्षण करने और यह निर्धारित करने की आवश्यकता होती है कि कौन सा विकल्प कम मेमोरी और सीपीयू समय का उपयोग करता है। अधिक जानकारी के लिए NikiC द्वारा नीचे दिया गया SO पोस्ट देखें।

  4. कोड पठनीयता।
    PHP में संदर्भ बनाना कुछ ऐसा है जो जल्दी से हाथ से निकल जाता है। यदि आप एक नौसिखिया हैं और आपके पास क्या कर रहे हैं, इसका पूरा नियंत्रण नहीं है, तो संदर्भों से दूर रहना सबसे अच्छा है। &ऑपरेटर के बारे में अधिक जानकारी के लिए इस गाइड पर एक नज़र डालें: संदर्भ - इस प्रतीक का PHP में क्या अर्थ है?
    उन लोगों के लिए जो PHP भाषा के इस हिस्से के बारे में अधिक जानना चाहते हैं: PHP संदर्भ समझाया

PHP foreach छोरों के आंतरिक तर्क के @NikiC द्वारा एक बहुत अच्छी तकनीकी व्याख्या:
PHP 'foreach' वास्तव में कैसे काम करता है?


सूचीबद्ध मुद्दों के अलावा, मैं समापन ब्रैकेट के unset($value);बाद जोड़ने की सलाह देता हूं foreach, यह सुनिश्चित करने के लिए कि उप-संदर्भ चर अब पुनरावृत्ति के बाद उपलब्ध नहीं है। 3v4l.org/2V2AQ
फेरी करें

15

उपयोग foreach($fields as &$field){- तो आप मूल सरणी के साथ काम करेंगे।

यहाँ संदर्भ से गुजरने के बारे में अधिक है।


@RBA pls ऊपर दिए गए उत्तरों का संदर्भ लें - उनके पास बहुत अधिक विवरण और अपडेट हैं - मैं अभी थोड़ी देर के लिए php का उपयोग नहीं करता हूं, इसलिए इस पर किसी भी अपडेट से अनजान
k102

1
function checkForm(& $fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

यह वह है जिसे मैं संदर्भ द्वारा सुझाएगा


इस तकनीक का उपयोग मूल चर के मूल्य को बदलने के लिए किया जाता है। चूंकि PHP वैल्यू टेक्नीक द्वारा पास का समर्थन करता है। हमें वेरिएबल के सामने 'और' कैरेक्टर को जोड़ने की जरूरत है जो संदर्भ द्वारा पारित किया जा सके
सागर कदम

1
फिर क्यों अभी भी लौट रहा है $fields?
MAZux

यह सुझाए गए 3 में से सबसे खराब उत्तर है। जो कोई भी इस जवाब पर ठोकर खाता है, कृपया डेटा को बदलने और उसे वापस करने के लिए अपने कार्यों को डिज़ाइन न करें। मूल लेखक के लिए: आपने कोई स्पष्टीकरण नहीं दिया है कि यह समाधान अन्य लोगों की तुलना में बेहतर क्यों होगा, या यह कैसे काम करता है ..
धर्मन

-6

इसे इस्तेमाल करे

function checkForm($fields){
        foreach($fields as $field){
            if($field['required'] && strlen($_POST[$field['name']]) <= 0){
                $field['value'] = "Some error";
            }
        }
        return $field;
    }

3
यह मत करो। मैं आपके कोड के साथ कम से कम दो चीजें गलत देख सकता हूं: $ फ़ील्ड को असाइन करना काम नहीं करता है (जब आप ऐसा करते हैं तो $ फ़ील्ड सरणी को कभी भी संशोधित नहीं किया जाता है), और $ फ़ील्ड लौटाता है एकवचन फ़ील्ड, सरणी नहीं।
स्टेपलरफहरर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.