পিএইচপি ফোরচ মূল অ্যারের মান পরিবর্তন করে


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
আপনি কতটা নতুন (বা আগে ব্যবহৃত হয়েছিলেন) - এটি আপনি এইচএইচপি
নিকোলে ইভানভ

উত্তর:


261

পিএইচপি-তে, রেফারেন্স দিয়ে পাস করা ( &) বিতর্কিত। আপনার প্রয়োজন কেন এবং ফলাফলগুলি পরীক্ষা না করা আপনি যদি না জানেন তবে আমি এটি ব্যবহার না করার পরামর্শ দিচ্ছি।

আমি নিম্নলিখিতগুলি করার সুপারিশ করব:

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

সুতরাং $fieldযখন আপনার মানগুলি প্রয়োজন হয় এবং $fields[$key]যখন আপনাকে ডেটা পরিবর্তন করার দরকার হয় তখন মূলত ব্যবহার করুন।


চমৎকার, এই কাজ! প্রথমে এরকম কিছু চেষ্টা করে দেখেছি, তবে আমি মনে করি যে আমি কোনও জায়গা খুঁজে পেয়েছি :) এখন আমি আপনার উদাহরণ হাজার বার ব্যবহার করব এবং কখনই ভুলব না! :)
জেপ্পি

এটা খুশী হয়েছে। এছাড়াও, আমি সংযুক্ত নিবন্ধটি এবং ফোরচের জন্য অফিসিয়াল ডকুমেন্টেশন ( php.net/manual/ro/control-structures.foreach.php ) পড়ার পরামর্শ দিই
ভ্লাদ

4
নীচের লাইন: আপনি যদি অ্যারে / ভেরিয়েবল পরিবর্তন করতে চলেছেন - তবে আপনার একটি রেফারেন্স ব্যবহার করা উচিত। এটি দ্রুত, ক্লিনার এবং আরও পঠনযোগ্য।
লুলু

2
আমি আগ্রহী কেন একটি রেফারেন্স দিয়ে পাস foreachকরা বিতর্কিত হওয়া উচিত? এটি লুকানো পার্শ্ব প্রতিক্রিয়া বা যে কোনও কিছুর সাথে ফাংশন কলের মতো নয়।
আনকাএলবি

1
"রেফারেন্স দ্বারা (এবং) পাস করা ... বিতর্কিত", "রেফারেন্স দ্বারা পাস করবেন না" বা "রেফারেন্সের মাধ্যমে পাস করা খারাপ" এর পরিবর্তে ধন্যবাদ দেওয়ার জন্য আপনাকে ধন্যবাদ। শিখা যুদ্ধ শুরু করার সম্ভাবনা কম। :)
বিন বিন

162

ব্যবহার &:

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

&রেফারেন্স হিসাবে অ্যারের মান পাস করে এবং ভেরিয়েবলের একটি নতুন উদাহরণ তৈরি করে না। সুতরাং আপনি যদি রেফারেন্স পরিবর্তন করেন তবে আসল মানটি বদলে যাবে।

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

2018 সম্পাদনা করুন
এই উত্তরটি ইন্টারনেটে প্রচুর লোকেরা পছন্দ করেছেন বলে মনে হয়েছে, এ কারণেই আমি আরও তথ্য এবং সতর্কতার শব্দ যুক্ত করার সিদ্ধান্ত নিয়েছি।
যদিও রেফারেন্স বাই foreach(বা ফাংশন) একটি পরিষ্কার এবং সংক্ষিপ্ত সমাধান, অনেক প্রাথমিকের পক্ষে এটি একটি বিপজ্জনক ক্ষতি হতে পারে।

  1. পিএইচপি-র লুপগুলির নিজস্ব সুযোগ নেই। - @ মার্ক আমেরিকা

    যখন ভেরিয়েবলগুলি একই সুযোগে পুনরায় ব্যবহার করা হচ্ছে তখন এটি মারাত্মক সমস্যা হতে পারে। অন্য একটি প্রশ্ন খুব সুন্দরভাবে বর্ণনা করেছে যে কেন এটি কোনও সমস্যা হতে পারে।

  2. যেমন foreach পিএইচপি 5 এর অভ্যন্তরীণ অ্যারে পয়েন্টারের উপর নির্ভর করে, লুপের মধ্যে এটি পরিবর্তন করা অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে। - পূর্বাভাস জন্য পিএইচপি ডক্স

    একই লুপের পুনরাবৃত্তির সময় কোনও রেকর্ড আনসেট করা বা হ্যাশ মান (কী) পরিবর্তন করা পিএইচপি <7 এ সম্ভাব্য অপ্রত্যাশিত আচরণের কারণ হতে পারে <7.

  3. ফরচ পারফরম্যান্স।
    সাধারণভাবে পিএইচপি অনুলিপি বৈশিষ্ট্যের কারণে মান দ্বারা পাস পছন্দ করে। এর অর্থ হ'ল অভ্যন্তরীণভাবে পিএইচপি কোনও সদৃশ ডেটা তৈরি করবে না যতক্ষণ না এর অনুলিপি পরিবর্তন করার প্রয়োজন হয়। রেফারেন্স বাই পাস foreachকোনও পারফরম্যান্স উন্নতির প্রস্তাব দেয় কিনা তা বিতর্কযোগ্য । যেহেতু এটি সর্বদা ক্ষেত্রে থাকে, আপনাকে আপনার নির্দিষ্ট পরিস্থিতি পরীক্ষা করতে হবে এবং কোন বিকল্পটি কম মেমরি এবং সিপিইউ সময় ব্যবহার করে তা নির্ধারণ করতে হবে। আরও তথ্যের জন্য নীকি দ্বারা লিঙ্কিত এসও পোস্টটি দেখুন।

  4. কোড পাঠযোগ্যতা।
    পিএইচপি-তে রেফারেন্স তৈরি করা এমন এক জিনিস যা দ্রুত হাতের বাইরে চলে যায়। আপনি যদি একজন শিক্ষানবিশ হন এবং আপনি যা করছেন তার পুরো নিয়ন্ত্রণ না থাকলে, উল্লেখগুলি থেকে দূরে থাকাই ভাল। &অপারেটর সম্পর্কে আরও তথ্যের জন্য এই গাইডটি একবার দেখুন: তথ্যসূত্র - পিএইচপি-র মধ্যে এই প্রতীকটির অর্থ কী?
    যারা পিএইচপি ভাষার এই অংশটি সম্পর্কে আরও জানতে চান তাদের জন্য: পিএইচপি রেফারেন্স ব্যাখ্যা করা হয়েছে la

পিএইচপি ফোর্যাচ লুপের অভ্যন্তরীণ লজিকের @ নিকি'র একটি খুব সুন্দর প্রযুক্তিগত ব্যাখ্যা:
পিএইচপি 'ফোরচ' আসলে কীভাবে কাজ করে?


তালিকাভুক্ত ইস্যুগুলি বাদ দিয়ে, আমি ক্লোসিং বন্ধনীর unset($value);পরে যুক্ত করার পরামর্শ দিই foreach, যাতে বাই-রেফারেন্স ভেরিয়েবলটি পুনরাবৃত্তির পরে আর পাওয়া যায় না তা নিশ্চিত করতে। 3v4l.org/2V2AQ
fyrye

15

ব্যবহার করুন foreach($fields as &$field){- সুতরাং আপনি মূল অ্যারের সাথে কাজ করবেন।

এখানে রেফারেন্স দ্বারা পাস সম্পর্কে আরও।


@ আরবিএ pls উপরের উত্তরগুলি উল্লেখ করুন - তাদের আরও অনেক বিবরণ এবং আপডেট রয়েছে - আমি আপাতত পিএইচপি ব্যবহার করি নি, তাই এর কোনও আপডেট সম্পর্কে অজানা
k102

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

এটিই আমি রেফারেন্সের মাধ্যমে পাসের পরামর্শ দেব


এই প্রযুক্তিটি মূল ভেরিয়েবলের মান পরিবর্তন করতে ব্যবহৃত হয়। পিএইচপি যেহেতু পাস বাই ভ্যালু টেকনিককে সমর্থন করে। সেই মানটি রেফারেন্স দিয়ে পাস করার জন্য আমাদের ভেরিয়েবলের সামনে 'এবং' চরিত্র যুক্ত করতে হবে
সাগর কদম

1
তাহলে এখনও কেন ফিরছেন $fields?
মজাক্স

এটি প্রস্তাবিত 3 টির মধ্যে সবচেয়ে খারাপ উত্তর। এই উত্তরটিতে যে কেউ হোঁচট খায় তার জন্য, দয়া করে আপনার ফাংশনগুলি ডেটা জায়গায় রেখে পরিবর্তন করতে ডিজাইন করবেন না। মূল লেখক জন্য: আপনি যে কোনো ব্যাখ্যা প্রদান করেন নি কেন এই সমাধান অন্যান্য বেশী বেশী ভালো হবে, বা কিভাবে এটি সমস্ত .. এ কাজ করে
Dharman

-6

এটা চেষ্টা কর

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

3
এটা করো না. আমি আপনার কোডের সাথে কমপক্ষে দুটি জিনিস ভুল দেখতে পাচ্ছি: $ ক্ষেত্রের জন্য বরাদ্দকরণ কাজ করে না (আপনি যখন এটি করেন তখন you ক্ষেত্রের অ্যারেটি কখনই সংশোধন করা হয় না) এবং ফিরে return ক্ষেত্র একক ক্ষেত্র দেয়, অ্যারে নয় not
স্ট্যাপলারফাহার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.