পিএইচপি - অবজেক্টের অ্যারে থেকে একটি সম্পত্তি আহরণ করা


128

আমি একটি বিড়াল বস্তুর একটি অ্যারে পেয়েছি:

$cats = Array
    (
        [0] => stdClass Object
            (
                [id] => 15
            ),
        [1] => stdClass Object
            (
                [id] => 18
            ),
        [2] => stdClass Object
            (
                [id] => 23
            )
)

এবং আমি 1 লাইনে বিড়ালের আইডিগুলির একটি অ্যারেগুলি বের করতে চাই (কোনও ফাংশন বা লুপ নয়)।

আমি এর array_walkসাথে ব্যবহারের বিষয়ে ভাবছিলাম create_functionকিন্তু এটি কীভাবে করব তা আমি জানি না।

কোন ধারণা?


আমি একটি লুপ ব্যবহার করতে চাই না কারণ আমি ফলাফলটি 1 টি লাইনে অর্পণ করতে সক্ষম হতে চাই: $ বিড়াল_আইডি = মাইফংশন ($ বিড়াল); / * এর অ্যারে (15, 18, 23) ফেরত দেওয়া উচিত * /
অধিকতর

উত্তর:


149

আপনার যদি পিএইচপি 5.5 বা তার পরে থাকে তবে বিল্ট ইন ফাংশনটি ব্যবহার করা সবচেয়ে ভাল উপায় array_column():

$idCats = array_column($cats, 'id');

তবে পুত্রকে অ্যারে হতে হবে বা অ্যারেতে রূপান্তর করতে হবে


12
এটি আসলে সেরা উত্তর
দিমিত্রি বুসলেভ

1
সেরা সমাধান, তবে কেবল পিএইচপি 5.5 বা তার বেশি জন্য উপলব্ধ
লুডো - রেকর্ডটি বন্ধ

2
যে কোনওভাবে 5.5 এর সাথে আর কোডিং করা উচিত নয়। 3.5 বছরের পুরানো প্রোগ্রামিং ভাষার সংস্করণ ...
তোসকান

11
এই সমাধান প্রশ্নের উত্তর করে না তাই array_columnএকটি সাথে কাজ করে না arrayএর objectসব গুলি। যেহেতু পিএইচপি 7.0.0 সম্ভব হল: stackoverflow.com/a/23335938/655224
algorhythm

1
এটি তখনই কাজ করে যখন অবজেক্ট প্রোপার্টিটিতে সর্বজনীন অ্যাক্সেস থাকে।
করোল গ্যাসিয়েনিকা

154

সতর্কতা create_function() পিএইচপি 7.2.0 হিসাবে অবহিত করা হয়েছে। এই ফাংশন উপর নির্ভর করা অত্যন্ত নিরুৎসাহিত করা হয়।

আপনি array_map()ফাংশন ব্যবহার করতে পারেন ।
এটি করা উচিত:

$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);

54
এটি সঠিক সমাধান এবং এটি আসবে যে প্রতিটি আগত রক্ষণাবেক্ষণকারী "ডব্লিউটিএফ" 'ডি: ডি
আন্দ্রেয়াস ক্লিঞ্জার

4
এই সমাধানটি সম্পর্কে আমি কেবলমাত্র অপছন্দ করি তা হ'ল ক্রিয়েট ফাংশন ব্যবহার।
আয়নু জি স্টান

4
আপনি একটি ল্যাম্বডা ফাংশন ব্যবহার করতে পারেন তবে অনেক লোক পিএইচপি 5.3 চালাবেন না
গ্রেগ

26
আমরা এখানে যাচ্ছি: $project_names = array_map(function($project) { return $project->name ;}, $projects );তবে, এটি এই ব্লগ পোস্টে উল্লেখ করা হয়েছে যে এটি 2.5 গতি কম হতে পারে / মেমরি এইভাবে করা যায়।
পুনঃপ্রকাশ

7
আমি খুঁজে পেয়েছি, যে প্রতিটি সময় ফাংশন তৈরি করা create_functionহয় মেমরি সঙ্গে বড় হয়। আপনি যদি অসীম লুপগুলি সহ একটি প্রোগ্রাম লিখেন এবং এর array_mapসাথে কল করেন create_functionতবে আপনি সর্বদা কিছু Out of memory...সময় ত্রুটি পাবেন । সুতরাং ব্যবহার create_functionএবং ব্যবহার করবেন নাarray_map(function($o) { return $o->id; }, $objects);
আলগোরিদম

87

সমাধানটি আপনি যে পিএইচপি সংস্করণটি ব্যবহার করছেন তার উপর নির্ভর করে। কমপক্ষে 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
...


এটি এখানেও আলোচনা হতে পারে

মেমরি লিক?! আবর্জনা সংগ্রাহক 'অ্যারে_ম্যাপ' এর মধ্যে 'ক্রিয়েটি ফাংশন' ব্যবহার করার সময় কি ঠিকঠাক করছেন?


যদিও আমি পিএইচপি 7.2 ব্যবহার করছি তবে মনে হচ্ছে সমাধানের কাজটি যদি আপনি নেমস্পেস ক্লাসের অবজেক্টগুলি ব্যবহার করে থাকেন এবং খালি অ্যারেটি ফেরত দেয় তবে এটি কাজ করে না।
মুহাম্মদ ওমর আসলাম

আপনি একটি শোষণ পোস্ট করতে পারেন? আপনার প্রসঙ্গটি আরও ভালভাবে বোঝার জন্য একটি সংক্ষিপ্ত স্নিপেট?
অ্যালগোরিদম

উদাহরণস্বরূপ, এই স্নিপেটটি দেখুন যেখানে আমার কাছে ড্রপবক্স এপিআই এসডিকে ফিরিয়ে দেওয়া মডেল অবজেক্টগুলির একটি তালিকা রয়েছে এবং যখন আমরা array_columnএই অ্যারেটি ব্যবহার করার চেষ্টা করি এটি সর্বদা ফাঁকা ফিরে আসে যেখানে এই স্নিপেটটি সঠিকভাবে কাজ করে, উভয়েরই সুরক্ষিত সম্পত্তি রয়েছে যা দ্বিতীয় স্নিপেটে অ্যাক্সেসযোগ্য কেবল. নেমস্পেস ছাড়া অন্য কোনও কারণ খুঁজে পাইনি।
মুহাম্মদ ওমর আসলাম

আমি যখন objectআমার সমাধানটিতে লিখি তখন আমি বোঝাতে চাইছি objectনা Object। নিম্নচিকিত্সা objectসরল অবজেক্টটি বর্ণনা করে \stdClass। হয়তো এটাই সমস্যা। আপনার Objectকি কোনও toArrayপদ্ধতি আছে? এটা ব্যবহার কর. একটি সাধারণ objectএবং একটি arrayপ্রায় একই। অনুসরণ করছেন পরিবর্তিত বৈধ হতে হবে: ((object)(array)$o) === $o__getপদ্ধতি প্রয়োগ করার সময় আপনি আপনার শ্রেণীর বৈশিষ্ট্য সকলের জন্য অ্যাক্সেসযোগ্য করে তুলবেন। এটি প্রত্যাশিত আচরণ হতে পারে। তবে আপনি নিজের array<Object>উদাহরণ দিয়ে পুনরাবৃত্তি করতে পারেন array_mapএবং কল toArray(যদি উপস্থিত থাকে) এবং তারপরে এটিও কাজ করে
00

আমি যে দ্বিতীয় স্নিপেটটি সরবরাহ করেছি তা পিএইচপি, নেট থেকে এবং প্রথম স্নিপেটের মতো একই শ্রেণীর অবজেক্টটি ব্যবহার করে, সম্ভবত আপনি ঠিক এটির কিছু হতে পারে আমি এটিকে অ্যারে থ্যানকিউতে রূপান্তর করে চেষ্টা করব।
মুহাম্মদ ওমর আসলাম

4
function extract_ids($cats){
    $res = array();
    foreach($cats as $k=>$v) {
        $res[]= $v->id;
    }
    return $res
}

এবং এটি এক লাইনে ব্যবহার করুন :

$ids = extract_ids($cats);

1
ধন্যবাদ সাইলেন্টগোস্ট, তবে আমার প্রশ্নটি লুপ ব্যবহার না করে কেবল ১ টি কমান্ডের মধ্যে
রেজাল্ট পাওয়ার কথা

2
কি পার্থক্য এটা করতে না? এটি যতটা সরল-এগিয়ে চলেছে ততটাই। আপনি সম্ভবত এর মতো কিছু ব্যবহার করে আরও লাইন ব্যবহার করবেন array_walk
প্রতারণা করুন

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

3

কোড

<?php

# setup test array.
$cats = array();
$cats[] = (object) array('id' => 15);
$cats[] = (object) array('id' => 18);
$cats[] = (object) array('id' => 23);

function extract_ids($array = array())
{
    $ids = array();
    foreach ($array as $object) {
        $ids[] = $object->id;
    }
    return $ids;
}

$cat_ids = extract_ids($cats);
var_dump($cats);
var_dump($cat_ids);

?>

আউটপুট

# var_dump($cats);
array(3) {
  [0]=>
  object(stdClass)#1 (1) {
    ["id"]=>
    int(15)
  }
  [1]=>
  object(stdClass)#2 (1) {
    ["id"]=>
    int(18)
  }
  [2]=>
  object(stdClass)#3 (1) {
    ["id"]=>
    int(23)
  }
}

# var_dump($cat_ids);
array(3) {
  [0]=>
  int(15)
  [1]=>
  int(18)
  [2]=>
  int(23)
}

আমি জানি এটির লুপটি ব্যবহার করা, তবে এটি করার সহজতম উপায়! এবং একটি ফাংশন ব্যবহার করে এটি এখনও এক লাইনে শেষ হয়।


আমি বুঝতে পারছি না কেন লোকেরা কেবল এর মতো সহজ সমাধান বেছে নেয় না। আপনি আমাকে জিজ্ঞাসা করলে এইভাবে এটি করা যৌক্তিক বলে মনে হচ্ছে।
টম ডায়ার

3

আপনি ওউজো গুডিজ সহ এটি সহজেই করতে পারেন

$result = array_map(Functions::extract()->id, $arr);

বা অ্যারে সহ (ওজো গুডিজ থেকে)

$result = Arrays::map($arr, Functions::extract()->id);

চেক আউট: http://ouzo.readthedocs.org/en/latest/utils/function.html#extract

ওউজোর সাথে কার্যকরী প্রোগ্রামিংও দেখুন (আমি কোনও লিঙ্ক পোস্ট করতে পারি না)।


3

সতর্কতা create_function() পিএইচপি 7.2.0 হিসাবে অবহিত করা হয়েছে। এই ফাংশন উপর নির্ভর করা অত্যন্ত নিরুৎসাহিত করা হয়।

পিএইচপি-তে অন্তর্নির্মিত লুপগুলি দ্রুত এবং তত্পরভাবে ব্যাখ্যা করা লুপ হয়, সুতরাং এটি এটিকে একটি এক-লাইনার হিসাবে বানাতে আসলে বোঝা যায়:

$result = array();
array_walk($cats, create_function('$value, $key, &$result', '$result[] = $value->id;'), $result)


0
    $object = new stdClass();
    $object->id = 1;

    $object2 = new stdClass();
    $object2->id = 2;

    $objects = [
        $object,
        $object2
    ];

    $ids = array_map(function ($object) {
        /** @var YourEntity $object */
        return $object->id;
        // Or even if you have public methods
        // return $object->getId()
    }, $objects);

আউটপুট : [১, ২]


0

create_function()ফাংশন এ অনুমোদিত নয় পিএইচপি v7.2.0 । আপনি array_map()প্রদত্ত হিসাবে ব্যবহার করতে পারেন ,

function getObjectID($obj){
    return $obj->id;
}

$IDs = array_map('getObjectID' , $array_of_object);

বিকল্পভাবে, আপনি array_column()ফাংশনটি ব্যবহার করতে পারেন যা কলাম_কি দ্বারা চিহ্নিত ইনপুটটির একক কলাম থেকে মানগুলি ফেরত দেয়। Allyচ্ছিকভাবে ইনপুট অ্যারের ইনডেক্স_কি কলাম থেকে মানগুলি দ্বারা প্রতীয়মান অ্যারেতে মানগুলিকে সূচক সরবরাহ করা হতে পারে index আপনি প্রদত্ত হিসাবে অ্যারে_ কলামটি ব্যবহার করতে পারেন,

$IDs = array_column($array_of_object , 'id');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.