পিএইচপি - অবজেক্টের অ্যারে থেকে অবজেক্ট প্রোপার্টি দ্বারা এন্ট্রি সন্ধান করুন


174

অ্যারের মতো দেখাচ্ছে:

[0] => stdClass Object
        (
            [ID] => 420
            [name] => Mary
         )

[1] => stdClass Object
        (
            [ID] => 10957
            [name] => Blah
         )
...

এবং আমার কাছে একটি পূর্ণসংখ্যার ভেরিয়েবল বলা হয় $v

আমি কীভাবে এমন অ্যারে এন্ট্রি নির্বাচন করতে পারি যেখানে এমন একটি বস্তু রয়েছে যেখানে IDসম্পত্তিটির $vমূল্য আছে?

উত্তর:


189

আপনি হয় অ্যারে পুনরাবৃত্তি, নির্দিষ্ট রেকর্ড অনুসন্ধান (ঠিক একবারে অনুসন্ধান শুধুমাত্র) বা অন্য একটি সহযোগী অ্যারে ব্যবহার করে একটি হ্যাশম্যাপ তৈরি।

প্রাক্তনদের জন্য, এই জাতীয় কিছু

$item = null;
foreach($array as $struct) {
    if ($v == $struct->ID) {
        $item = $struct;
        break;
    }
}

পরের বিষয়ে আরও তথ্যের জন্য এই প্রশ্নটি এবং পরবর্তী উত্তরগুলি দেখুন - একাধিক সূচী দ্বারা পিএইচপি রেফারেন্স রেফারেন্স


3
নালিতে আইটেম সেট করার দরকার নেই।
dAm2K

32
ওফস, এটি সেখানে রয়েছে :) এটি যদি চাওয়া আইটেম অ্যারে না থাকে। বিকল্পভাবে, আপনি ব্যবহার করতে পারেন isset($item)তবে আমি সঠিকভাবে পরিবর্তনশীল সূচনা করতে পছন্দ করি
ফিল

3
আপনার কাছে কী মানগুলির সাথে স্ট্রিং সেট রয়েছেif($v == $struct["ID"]){...
wbartart

67

ইয়ুরকমটাইম ঠিক আছে। এটির জন্য কেবল একটি পরিবর্তন প্রয়োজন:

ফাংশন ($) এর পরে আপনার "ব্যবহার (& $ সন্ধানী মূল্য)" দ্বারা বাহ্যিক ভেরিয়েবলের জন্য একটি পয়েন্টার প্রয়োজন এবং তারপরে আপনি বাহ্যিক চলকটি অ্যাক্সেস করতে পারেন। এছাড়াও আপনি এটি পরিবর্তন করতে পারেন।

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use (&$searchedValue) {
        return $e->id == $searchedValue;
    }
);

2
আপনি এই পরিবর্তনটি সম্পর্কে সঠিক এবং এটি একটি ঝরঝরে পদ্ধতি, তবে আমি বস্তুর মাধ্যমে পুনরাবৃত্তির তুলনায় গতিটি পরীক্ষা করেছিলাম - নিজেই, কারণ @ ফিল্মের মতো, অ্যারে_ ফিল্টার এটিও করছে - এবং এই পদ্ধতিটি প্রায় পাঁচটি গ্রহণ করছে লম্বা। আমার পরীক্ষার বিষয়টি কোনও বড় নয়, যাতে এটি আরও খারাপ হতে পারে।
নিকোলাই

9
&যখন আমদানি প্রয়োজন হয় না $searchedValueঅবসান সুযোগ মধ্যে। &একটি রেফারেন্স যা শুধুমাত্র প্রয়োজন হয় যদি তৈরি করতে ব্যবহার করা হয় $searchedValueঅবসান ভিতরে পরিবর্তন করা হয়েছে।
স্টিফান গেহরিগ

চমৎকার. আমি জানতাম না পিএইচপি এই জাতীয় জিনিসগুলি করতে পারে। আমি ভেবেছিলাম ব্যবহারের globalএকমাত্র ছিল ফাংশনগুলিতে ডেটা ভাগ করা! তবে এটি দুঃখের বিষয় যদি সত্যই ধীর হয়। :(
Noone

13
টিএস একটি একক প্রবেশের জন্য জিজ্ঞাসা করেছিল, এই কোডটি একটি অ্যারে দেয়।
পাভেল ভ্লাসভ

57
$arr = [
  [
    'ID' => 1
  ]
];

echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)

3
কেন এটি পছন্দসই উত্তর নয় তা নিশ্চিত নন। আপনি দুটি ফাংশন কল করছেন কারণ এটি?
ডায়েজ 87

1
আমি মনে করি পার্টির জন্য আমি অনেক দেরি করেছি;) এর ঘাটতি এবং কোনও লুপ এবং ব্রেক ছাড়াই পাঠযোগ্যতা এটিকে যুক্তিসঙ্গত করে তুলবে। তবে এটি এখনও বেঞ্চমার্ক করেনি। এটি অর্জনের জন্য আপনার কাছে পিএইচপি-তে প্রচুর অপশন রয়েছে।
টিম

3
খুব মার্জিত সমাধান। পিএইচপি in. এ অবজেক্টের অ্যারের সাথেও কাজ করে PH পিএইচপি 5 এর জন্য: অ্যারে_সার্চ ($ অবজেক্ট-> আইডি, অ্যারে_ম্যাপ (ফাংশন ($ অবজেক্ট) {রিটার্ন $ অবজেক্ট-> আইডি;}, $ অবজেক্টস))); পিএইচপি 7 এর জন্য: অ্যারে_সার্চ ($ অবজেক্ট-> আইডি, অ্যারে_কলাম ($ অবজেক্টস, 'আইডি'));
মাইক

3
এটি পছন্দসই উত্তর নয় কারণ অপেক্ষাকৃত বস্তুর অ্যারের জন্য জিজ্ঞাসা করে এবং এই উত্তরদাতা কেবল খাঁটি অ্যারে পরিচালনা করে।
দ্বুজা

8
সঠিক না। এই কোডটি অবজেক্টস / নন ফ্ল্যাট অ্যারে পরিচালনা করে
টিম

31

আমি এখানে আরও মার্জিত সমাধান খুঁজে পেয়েছি । এই প্রশ্নের মতো দেখাতে পারে এমন:

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use ($searchedValue) {
        return $e->id == $searchedValue;
    }
);

16
+1 তবে array_filterএকটি অ্যারে প্রদান করে এবং পাওয়া প্রথম মানটি থামবে না।
কার্লোস ক্যাম্পাদ্রেসের

4
এটি $searchedValueফাংশনটির ভিতরে স্বীকৃতি দিচ্ছে না । তবে এর বাইরেও রয়েছে।
এম আহমেদ জাফর

4
প্রারম্ভিকদের জন্য, এই কোডটি $searchedValueক্লোজার স্কোপের বাইরে যেমন কাজ করে না । দ্বিতীয়ত, আপনি কীভাবে মনে করেন এই অ্যারে পদ্ধতিগুলি কাজ করে? তারা সমস্ত অভ্যন্তরীণভাবে অ্যারের উপরে লুপ করে
ফিল

1
মাল্টি কোরের সময়, দুর্ভাগ্যক্রমে অন্যান্য প্রোগ্রামিং পরিবেশে এটি - সমান্তরালভাবে প্রক্রিয়া করা যেতে পারে, উপরের লুপটি অগত্যা নয়
ফ্লয়েডথ্রিপউড

3
ব্যবহার করার জন্য $searchedValueপ্রয়োজন লেখfunction ($e) use ($searchedValue) {
Vilintritenmert

20

রি-ইনডেক্সে অ্যারে_ কলামটি ব্যবহার করা আপনার একাধিকবার সন্ধানের প্রয়োজন হলে সময় সাশ্রয় করবে:

$lookup = array_column($arr, NULL, 'id');   // re-index by 'id'

তারপরে আপনি কেবল $lookup[$id]ইচ্ছামত পারেন।


3
এটি সবচেয়ে আশ্চর্যজনক উত্তর ছিল, যদিও এটি সবচেয়ে স্বজ্ঞাত নয় ...
থিয়াগো নাটানেল

11
class ArrayUtils
{
    public static function objArraySearch($array, $index, $value)
    {
        foreach($array as $arrayInf) {
            if($arrayInf->{$index} == $value) {
                return $arrayInf;
            }
        }
        return null;
    }
}

আপনি যেভাবে চান তা এটি ব্যবহার করার মতো কিছু হবে:

ArrayUtils::objArraySearch($array,'ID',$v);


7

@ ইয়ুরকাটাইমের একটি ছোট্ট ভুল সংশোধন করা , আপনার সমাধানটি আমার পক্ষে কাজ করে তবে যুক্ত করা use:

ব্যবহার করতে $searchedValue, ফাংশনের অভ্যন্তরে, একটি সমাধান use ($searchedValue)ফাংশন পরামিতিগুলির পরে হতে পারে function ($e) HERE

array_filterফাংশন শুধুমাত্র ফিরে $neededObjectযদি লাভের ওপর অবস্থাtrue

যদি $searchedValueস্ট্রিং বা পূর্ণসংখ্যা হয়:

$searchedValue = 123456; // Value to search.
$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use ($searchedValue) {
        return $e->id == $searchedValue;
    }
);
var_dump($neededObject); // To see the output

যদি $searchedValueঅ্যারে হয় তবে আমাদের একটি তালিকা দিয়ে চেক দরকার:

$searchedValue = array( 1, 5 ); // Value to search.
$neededObject  = array_filter(
    $arrayOfObjects,
    function ( $e ) use ( $searchedValue ) {
        return in_array( $e->term_id, $searchedValue );
    }
);
var_dump($neededObject); // To see the output

1
আমার মনে হয় শেষ লাইনটি হওয়া উচিত var_dump($neededObject);:)
সিকিক

3

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

$haystack = array($obj1, $obj2, ...); //some array of objects
$needle = 'looking for me?'; //the value of the object's property we want to find

//carry out the search
$search_results_array = array_reduce(
  $haystack,

  function($result_array, $current_item) use ($needle){
      //Found the an object that meets criteria? Add it to the the result array 
      if ($current_item->someProperty == $needle){
          $result_array[] = $current_item;
      }
      return $result_array;
  },
  array() //initially the array is empty (i.e.: item not found)
);

//report whether objects found
if (count($search_results_array) > 0){
  echo "found object(s): ";
  print_r($search_results_array[0]); //sample object found
} else {
  echo "did not find object(s): ";
}

1
আপনার শর্তসাপেক্ষে আপনি টাইপ করেছেন যেখানে আপনি টোটাল যোগ করছেন তিনি ফলাফল_আররে। এটি হওয়া উচিত:if ($current_item->someProperty == $needle){ $result_array[] = $current_item; }
অ্যাড্রাম

স্থায়ী. ধন্যবাদ @ অ্যাড্রাম!
yuvilio

1

আমি কিছু ধরণের জাভা কীম্যাপ দিয়ে এটি করেছি। যদি আপনি এটি করেন তবে আপনাকে প্রতিবার আপনার বস্তুর অ্যারে লুপ করার দরকার নেই।

<?php

//This is your array with objects
$object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65);
$object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25);
$object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75);
$firstArray = Array($object1,$object2);
var_dump($firstArray);

//create a new array
$secondArray = Array();
//loop over all objects
foreach($firstArray as $value){
    //fill second        key          value
    $secondArray[$value->id] = $value->name;
}

var_dump($secondArray);

echo $secondArray['123'];

আউটপুট:

array (size=2)
  0 => 
    object(stdClass)[1]
      public 'id' => int 123
      public 'name' => string 'Henk' (length=4)
      public 'age' => int 65
  1 => 
    object(stdClass)[2]
      public 'id' => int 273
      public 'name' => string 'Koos' (length=4)
      public 'age' => int 25
array (size=2)
  123 => string 'Henk' (length=4)
  273 => string 'Koos' (length=4)
Henk

আহ, আইডি দিয়ে অ্যারে পুনর্নির্মাণ! আমি এটি সাধারণত করি এবং এটি জিনিসকে আরও সুন্দর করে তোলে।
Kjqai

1

তাত্ক্ষণিকভাবে প্রথম মান পাওয়ার উপায়:

$neededObject = array_reduce(
    $arrayOfObjects,
    function ($result, $item) use ($searchedValue) {
        return $item->id == $searchedValue ? $item : $result;
    }
);

0

আমি একটি দ্রুত বাইনারি অনুসন্ধান অ্যালগরিদম ব্যবহার করে এখানে খুব কার্যকরভাবে এই সমস্যাটি সমাধান করার জন্য যা ব্যবহার করি তা পোস্ট করেছি: https://stackoverflow.com/a/52786742/1678210

আমি একই উত্তরটি অনুলিপি করতে চাইনি। অন্য কেউ এটিকে কিছুটা আলাদাভাবে জিজ্ঞাসা করেছিলেন তবে উত্তরটি একই।

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