সমাধানটি আপনি যে পিএইচপি সংস্করণটি ব্যবহার করছেন তার উপর নির্ভর করে। কমপক্ষে 2 টি সমাধান রয়েছে:
প্রথম (নতুন পিএইচপি সংস্করণ)
@ জোসেপআলসিনা যেমন বলেছেন তার আগে সর্বোত্তম এবং সংক্ষিপ্ত সমাধানটি array_columnনীচের হিসাবে ব্যবহার করা:
$catIds = array_column($objects, 'id');
বিজ্ঞপ্তি:
একটি iterating জন্য arrayধারণকারী \stdClassহিসাবে প্রশ্নে ব্যবহৃত স্প্যানিশ ভাষায় এটি পিএইচপি সংস্করণের সাথে শুধুমাত্র সম্ভব >= 7.0। তবে একটি arrayসমন্বিত arrayগুলি ব্যবহার করার সময় আপনি পিএইচপি করার পরে একই কাজ করতে পারেন >= 5.5।
দ্বিতীয় (পুরানো পিএইচপি সংস্করণ)
@ গ্রেগ পুরানো পিএইচপি সংস্করণে বলেছেন যে নিম্নলিখিতগুলি করা সম্ভব:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
তবে সাবধান থাকুন: নতুন পিএইচপি সংস্করণগুলিতে এর মতো >= 5.3.0ব্যবহার করা আরও ভাল Closure:
$catIds = array_map(function($o) { return $o->id; }, $objects);
পার্থক্য
প্রথম সমাধানটি একটি নতুন ফাংশন তৈরি করে এবং এটি আপনার র্যামে রাখে। আবর্জনা সংগ্রহকারী কোনও কারণে ইতিমধ্যে তৈরি করা এবং ইতিমধ্যে কল করা ফাংশন উদাহরণটি মেমরি থেকে সরিয়ে দেয় না। এবং এটি নির্বিশেষে যে তৈরি করা ফাংশন উদাহরণটি আর কখনও কল করা যায় না, কারণ এর জন্য আমাদের কোনও পয়েন্টার নেই। এবং পরের বার যখন এই কোডটি কল করা হবে, আবার একই ফাংশনটি তৈরি হবে। এই আচরণটি ধীরে ধীরে আপনার স্মৃতি পূরণ করে ...
তাদের তুলনা করতে মেমরি আউটপুট সহ উভয় উদাহরণ:
খারাপ
while (true)
{
$objects = array_map(create_function('$o', 'return $o->id;'), $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235616
4236600
4237560
4238520
...
ভাল
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
এটি এখানেও আলোচনা হতে পারে
মেমরি লিক?! আবর্জনা সংগ্রাহক 'অ্যারে_ম্যাপ' এর মধ্যে 'ক্রিয়েটি ফাংশন' ব্যবহার করার সময় কি ঠিকঠাক করছেন?