পিএইচপি - ফোরচ লুপে বর্তমান অবজেক্টটি সংশোধন করুন


111

আমি ভাবছিলাম যে foreachলুপের মধ্যে হ্যান্ডেল করা বর্তমান অবজেক্টটি সম্পাদনা করা সম্ভব কিনা?

আমি অবজেক্টগুলির একটি অ্যারে নিয়ে কাজ করছি $questionsএবং আমি আমার ডিবিতে এই প্রশ্নটির সাথে যুক্ত উত্তরগুলি সন্ধান করতে চাই। সুতরাং প্রতিটি প্রশ্নের উত্তর উত্তরগুলি আনুন এবং আমার লুপের $question ভিতরে বর্তমান আপডেট করুন foreachযাতে আমি অন্য কোথাও আউটপুট / প্রক্রিয়া করতে পারি।

foreach($questions as $question){
    $question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}

আর্টজমকুরাপভ এবং @ টোটেনার উভয়ের পরামর্শ অনুসারে আমি & সাইন ব্যবহার করে 'পাস বাই রেফারেন্স' খুঁজছি। ধন্যবাদ চ্যাপস :) আপনার দিনটি
শুভ হোক

উত্তর:


207

এটি করার 2 টি উপায় রয়েছে

foreach($questions as $key => $question){
    $questions[$key]['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}

এইভাবে আপনি কীটি সংরক্ষণ করুন, যাতে আপনি এটিকে আবার মূল $questionsভেরিয়েবলে আপডেট করতে পারেন

অথবা

foreach($questions as &$question){

যোগ করা আপডেট &রাখবে $questions। তবে আমি বলব প্রথমটি প্রস্তাবিত হয় যদিও এটি খাটো হলেও (পাইস্টির মন্তব্য দেখুন)

প্রতি পিএইচপি foreachডকুমেন্টেশন :

লুপ পূর্বের মধ্যে অ্যারে উপাদানগুলি সরাসরি সংশোধন করতে সক্ষম হওয়ার জন্য & এর সাথে মান। সেক্ষেত্রে মানটি রেফারেন্স দ্বারা নির্ধারিত হবে।


32
foreachপ্রকৃতপক্ষে উল্লেখগুলি প্রস্তাবিত নয়, যেভাবে foreachলুপের মান অংশের কাছাকাছি চলে যায় অপ্রত্যাশিত আচরণের ফলে। এটি আরও দীর্ঘ হতে পারে তবে আপনি এখানে 1 পদ্ধতি ব্যবহার করে আরও নিরাপদ।
পাইস্টে

1
আমি কেবল একটি পূর্বাভাসে একটি রেফারেন্স ব্যবহার করে সৃষ্ট সমস্যাটি ডিবাগ করার জন্য একটি বিভ্রান্ত ঘন্টা ব্যয় করেছি। আমি দ্বিতীয় ফরচ কলের জন্য একই পরিবর্তনশীল নামটি পুনরায় ব্যবহার করেছি - আমি প্রথম হিসাবে রেফারেন্স দিয়ে পাস করেছি, এটি অ্যারেতে শেষ আইটেমটি পরিবর্তন করে চলেছে! একটি সুস্পষ্ট সূচক ব্যবহার করতে সমস্যা হত না।
হিপ্পিজিম

7
@ পেস্টে আপনি কি আপনার উত্সগুলি উদ্ধৃত করতে পারেন বা একটি বিশদ ব্যাখ্যা দিতে পারেন?
নিকো

2
হেরফেরের রেফারেন্স কেন নিরাপদ হবে? সি / সি ++ যেখানে আপনি যেকোন জায়গায় অনিরাপদ রেফারেন্স পরিচালনা করতে হবে? এটিকে নিরাপদ করা বা না করা ভাষা নয়, এটি আপনার উপর নির্ভর করে।
কালজেম

2
@BabyAzerty: Paystey নয় "সাধারণভাবে" রেফারেন্স বললে, কিন্তু foreach: মত এই বিভীষিকা সম্বন্ধে stackoverflow.com/questions/3307409/... (খুব, @Nico, আপনার অবগতির।)
SZ।

6

অবশ্যই ব্যবহার করা array_mapএবং যদি কোনও ArrayAccessধারককে অবজেক্টগুলি অবলম্বন করার জন্য প্রয়োগ করা ব্যবহার করা তবে এটি কীভাবে চালিত করা যায় তবে এটি কীভাবে চালিত হয়?

অ্যারে মানচিত্রের শব্দার্থক শব্দগুলি আমি দেখেছি বেশিরভাগ ভাষা এবং বাস্তবায়ন জুড়ে একই। এটি ইনপুট অ্যারে উপাদানের উপর ভিত্তি করে একটি পরিবর্তিত অ্যারে ফিরিয়ে আনার জন্য ডিজাইন করা হয়েছে (উচ্চ স্তরের ভাষা সংকলন / রানটাইম ধরণের পছন্দ উপেক্ষা করে); একটি লুপ আরও যুক্তি সম্পাদন বোঝানো হয়।

আইডি / পিকে দ্বারা অবজেক্টগুলি পুনরুদ্ধারের জন্য, আপনি এসকিউএল ব্যবহার করছেন কিনা তা নির্ভর করে (এটি প্রস্তাবিত বলে মনে হচ্ছে), আমি বৈধ পিকেসের একটি অ্যারে পাব কিনা তা নিশ্চিত করার জন্য আমি একটি ফিল্টার ব্যবহার করব, তারপরে কমা দিয়ে এবং এসকিউএল ধারাতে স্থান দান করব IN()to ফলাফল সেট ফিরে। এটি এসকিউএল এর মাধ্যমে কয়েকটিটির পরিবর্তে একটি কল করে, কিছুটা call->waitচক্রকে অনুকূল করে তোলে । সবচেয়ে বড় কথা আমার কোডটি যে কোনও ভাষা থেকে দক্ষতার একটি ডিগ্রি সহ কাউকে ভালভাবে পড়তে পারে এবং আমরা মিউটিটি সমস্যাগুলির মধ্যে পড়ি না।

<?php

$arr = [0,1,2,3,4];
$arr2 = array_map(function($value) { return is_int($value) ? $value*2 : $value; }, $arr);
var_dump($arr);
var_dump($arr2);

বনাম

<?php

$arr = [0,1,2,3,4];
foreach($arr as $i => $item) {
    $arr[$i] = is_int($item) ? $item * 2 : $item;
}
var_dump($arr);

আপনি যদি জানেন যে আপনি কী করছেন কখনই মিউটিটি সমস্যা হবে না (যদি আপনি ওভাররাইটিংয়ের উপর লক্ষ্য রাখেন তবে $arrআপনি সর্বদা পারেন$arr = array_map এবং স্পষ্ট হতে পারবেন।


2
ভবিষ্যদ্বাণী করার চেয়ে অনেক বেশি স্বজ্ঞাত - এটি ঠিক এই ফাংশনটির জন্য ডিজাইন করা হয়েছে।
বেনজামিনহুল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.