পিএইচপি বহুমাত্রিক অ্যারে অনুসন্ধান (নির্দিষ্ট মান অনুসারে কী সন্ধান করুন)


114

আমার এই বহুমাত্রিক অ্যারে রয়েছে। আমাকে এটি সন্ধান করতে হবে এবং কেবলমাত্র কীটি "স্লাগ" এর মানের সাথে মেলে return আমি জানি বহুমাত্রিক অ্যারেগুলি অনুসন্ধানের বিষয়ে অন্যান্য থ্রেড রয়েছে তবে আমি আমার অবস্থার সাথে প্রয়োগ করার জন্য যথেষ্ট বুঝতে পারছি না। কোন সাহায্যের জন্য অনেক ধন্যবাদ!

সুতরাং আমার যেমন একটি ফাংশন প্রয়োজন:

myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1

এখানে অ্যারে:

$products = array (
1  => array(
        'name'          => 'The Breville One-Touch Tea Maker',
        'slug'          => 'breville-one-touch-tea-maker-BTM800XL',
        'shortname'     => 'The One-Touch Tea Maker',
        'listprice'     => '299.99',
        'price'         => '249.99',
        'rating'        => '9.5',
        'reviews'       => '81',
        'buyurl'        => 'http://www.amazon.com/The-Breville-One-Touch-Tea-Maker/dp/B003LNOPSG',
        'videoref1'     => 'xNb-FOTJY1c',
        'videoref2'     => 'WAyk-O2B6F8',
        'image'         => '812BpgHhjBML.jpg',
        'related1'      => '2',
        'related2'      => '3',
        'related3'      => '4',
        'bestbuy'       => '1',
        'quote'         => '',
        'quoteautor'    => 'K. Martino',
        ),

2  => array(
        'name'          => 'Breville Variable-Temperature Kettle BKE820XL',
        'slug'          => 'breville-variable-temperature-kettle-BKE820XL',
        'shortname'     => 'Variable Temperature Kettle',
        'listprice'     => '199.99',
        'price'         => '129.99',
        'rating'        => '9',
        'reviews'       => '78',
        'buyurl'        => 'http://www.amazon.com/Breville-BKE820XL-Variable-Temperature-1-8-Liter-Kettle/dp/B001DYERBK',
        'videoref1'     => 'oyZWBD83xeE',
        'image'         => '41y2B8jSKmwL.jpg',
        'related1'      => '3',
        'related2'      => '4',
        'related3'      => '5',
        'bestbuy'       => '1',
        'quote'         => '',
        'quoteautor'    => '',
        ),
);

উত্তর:


157

খুব সহজ:

function myfunction($products, $field, $value)
{
   foreach($products as $key => $product)
   {
      if ( $product[$field] === $value )
         return $key;
   }
   return false;
}

6
আপনি যদি এই ফাংশনটি শর্তসাপেক্ষ বিবৃতিতে ব্যবহার করছেন তবে আপনি টাইপের বিরুদ্ধে একটি নিরঙ্কুশ চেক করতে চাইছেন কারণ ফিরে আসা কীটিতে মাঝে মাঝে [0] এর সূচক থাকতে পারে। সুতরাং যদি শর্তসাপেক্ষ চেক করা হয় তবে এটির মতো দেখতে হবে: if (myfunction($array, 'field', 'value') !== FALSE )) // do something...
অ্যান্ডি কুক

159

আরেকটি প্রশ্রয়যোগ্য সমাধান array_search()ফাংশনের উপর ভিত্তি করে । আপনাকে পিএইচপি 5.5.0 ব্যবহার করতে হবে বা তার বেশি উচ্চতর ।

উদাহরণ

$userdb=Array
(
(0) => Array
    (
        (uid) => '100',
        (name) => 'Sandra Shush',
        (url) => 'urlof100'
    ),

(1) => Array
    (
        (uid) => '5465',
        (name) => 'Stefanie Mcmohn',
        (pic_square) => 'urlof100'
    ),

(2) => Array
    (
        (uid) => '40489',
        (name) => 'Michael',
        (pic_square) => 'urlof40489'
    )
);

$key = array_search(40489, array_column($userdb, 'uid'));

echo ("The key is: ".$key);
//This will output- The key is: 2

ব্যাখ্যা

ফাংশনটিতে array_search()দুটি যুক্তি রয়েছে। প্রথমটি হ'ল সেই মানটি যা আপনি অনুসন্ধান করতে চান। দ্বিতীয়টি যেখানে ফাংশনটি অনুসন্ধান করা উচিত। ফাংশনটি array_column()মূল কীগুলির উপাদানগুলির মান পায় 'uid'

সারসংক্ষেপ

সুতরাং আপনি এটি হিসাবে ব্যবহার করতে পারে:

array_search('breville-one-touch-tea-maker-BTM800XL', array_column($products, 'slug'));

বা, আপনি যদি পছন্দ করেন:

// define function
function array_search_multidim($array, $column, $key){
    return (array_search($key, array_column($array, $column)));
}

// use it
array_search_multidim($products, 'slug', 'breville-one-touch-tea-maker-BTM800XL');

মূল উদাহরণঃ (xfoxawy দ্বারা) পাওয়া যাবে দস্তাবেজপৃষ্ঠা
array_column()


হালনাগাদ

ভয়েল মন্তব্যের কারণে আমি কৌতূহলী ছিলাম, সুতরাং যে পদ্ধতিটি ব্যবহার array_searchকরে এবং গ্রহণযোগ্য উত্তরে প্রস্তাবিত পদ্ধতিটির কার্যকারিতা পরিমাপ করার জন্য আমি একটি সাধারণ পরীক্ষা করেছি ।

আমি এমন একটি অ্যারে তৈরি করেছি যার মধ্যে 1000 টি অ্যারে রয়েছে, কাঠামোটি এর মতো ছিল (সমস্ত ডেটা এলোমেলো করে দেওয়া হয়েছিল):

[
      {
            "_id": "57fe684fb22a07039b3f196c",
            "index": 0,
            "guid": "98dd3515-3f1e-4b89-8bb9-103b0d67e613",
            "isActive": true,
            "balance": "$2,372.04",
            "picture": "http://placehold.it/32x32",
            "age": 21,
            "eyeColor": "blue",
            "name": "Green",
            "company": "MIXERS"
      },...
]

নাম ক্ষেত্রের জন্য বিভিন্ন মানের জন্য আমি 100 বার অনুসন্ধান পরীক্ষা চালিয়েছি এবং তারপরে আমি গড় সময়টি মিলি সেকেন্ডে গণনা করেছি । এখানে আপনি একটি উদাহরণ দেখতে পারেন।

ফলাফলগুলি হ'ল এই উত্তরের প্রস্তাবিত পদ্ধতির মানটি পেতে 2E-7 এর দরকার ছিল, যখন স্বীকৃত উত্তর পদ্ধতির প্রায় 8E-7 প্রয়োজন।

যেমন আমি বলেছিলাম যে উভয় সময় এই আকারের সাথে একটি অ্যারে ব্যবহার করে কোনও অ্যাপ্লিকেশনের জন্য বেশ গ্রহণযোগ্য। যদি আকারটি অনেক বেড়ে যায় তবে আসুন 1 এম উপাদানগুলি বলি, তবে এই সামান্য পার্থক্যটিও বাড়ানো হবে।

আপডেট দ্বিতীয়

আমি সেই পদ্ধতির জন্য একটি পরীক্ষা যুক্ত করেছি array_walk_recursiveযা এখানে উত্তরগুলির কয়েকটিতে উল্লেখযোগ্য ছিল। ফলাফলটি পেয়েছে সঠিক। এবং যদি আমরা পারফরম্যান্সের দিকে মনোনিবেশ করি তবে পরীক্ষায় পরীক্ষিত অন্যদের চেয়ে এটি আরও খারাপ । পরীক্ষায় আপনি দেখতে পাচ্ছেন যে ভিত্তিক পদ্ধতির চেয়ে 10 গুণ ধীর array_search। আবার এটি বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য খুব প্রাসঙ্গিক পার্থক্য নয়।

আপডেট তৃতীয়

এই পদ্ধতিতে কয়েকটি সীমাবদ্ধতা চিহ্নিত করার জন্য @ মিকম্যাকুসা ধন্যবাদ:

  • এই পদ্ধতিটি সহযোগী কীগুলিতে ব্যর্থ হবে।
  • এই পদ্ধতিটি কেবল সূচকযুক্ত সাবারিগুলিতে কাজ করবে (0 থেকে শুরু করে এবং ক্রমাগত আরোহণ কীগুলি রয়েছে)।

কেউ এর পারফরম্যান্স জানেন? দেখে মনে হচ্ছে এটি চূড়ান্তভাবে ধীর হবে এবং এখনও 5.5 প্রয়োজন হবে। আমি 5.4 এ থাকায় আমি পরীক্ষা করতে পারি না।
ভেল ভিক্টাস

যে কেউ বোঝে না তাদের জন্য: পিএইচপি 7 এ, লুপগুলি দ্রুত হয় are যখন আমি ev. to এ eval.in উদাহরণে পরিবর্তিত হয়েছিলাম, অ্যারে_সার্কটি কিছুটা দ্রুত ছিল।
ভেল ভিক্টাস

চালাক! আমি অ্যারে_কলোমিন () দিয়ে অ্যারে_কলোমিন () ব্যবহার করে আরে_কলোমিন () ব্যবহার করে একটি অন্য কী তৈরি করলাম যা থেকে আমার ডাটামকে একটি পরিচিত কী দিয়ে ধরে ফেলবে, তবে এটি আরও মার্জিত।
ডেভিড

4
array_search()উইথ ব্যবহার array_column()করে ওপির নমুনা অ্যারেতে কাজ করবে না কারণ সাববারে কীগুলি শুরু হয় 1। এই পদ্ধতিটি এসোসিয়েটিভ কীগুলিতেও ব্যর্থ হবে। এই পদ্ধতিটি কেবল সূচকযুক্ত সাবারিগুলিতে কাজ করবে (শুরু করে 0এবং ক্রমাগত আরোহণ কীগুলি রয়েছে)। এর কারণ হ'ল array_column()এটির ফিরে আসা অ্যারেতে নতুন সূচি তৈরি করা হবে।
মিকম্যাকুসা

সম্পূর্ণ ঠিক @ মিকম্যাকুসা, আমি আপনার জ্ঞানের উত্তরে যুক্ত করেছি। সহায়তার জন্য ধন্যবাদ
আইভান রদ্রিগেজ টরেস

14

এই শ্রেণি পদ্ধতিটি একাধিক শর্ত দ্বারা অ্যারে অনুসন্ধান করতে পারে:

class Stdlib_Array
{
    public static function multiSearch(array $array, array $pairs)
    {
        $found = array();
        foreach ($array as $aKey => $aVal) {
            $coincidences = 0;
            foreach ($pairs as $pKey => $pVal) {
                if (array_key_exists($pKey, $aVal) && $aVal[$pKey] == $pVal) {
                    $coincidences++;
                }
            }
            if ($coincidences == count($pairs)) {
                $found[$aKey] = $aVal;
            }
        }

        return $found;
    }    
}

// Example:

$data = array(
    array('foo' => 'test4', 'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test1', 'bar' => 'baz3'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz4'),
    array('foo' => 'test4', 'bar' => 'baz1'),
    array('foo' => 'test',  'bar' => 'baz1'),
    array('foo' => 'test3', 'bar' => 'baz2'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test4', 'bar' => 'baz1')
);

$result = Stdlib_Array::multiSearch($data, array('foo' => 'test4', 'bar' => 'baz1'));

var_dump($result);

উত্পাদন করবে:

array(2) {
  [5]=>
  array(2) {
    ["foo"]=>
    string(5) "test4"
    ["bar"]=>
    string(4) "baz1"
  }
  [10]=>
  array(2) {
    ["foo"]=>
    string(5) "test4"
    ["bar"]=>
    string(4) "baz1"
  }
}

হাই ফ্যাটালিস্ট স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 40860030/… । এটি এই প্রশ্নের সাথে যুক্ত হয়েছে আপনি কি দয়া করে সেই প্রশ্নটি পরিষ্কার করতে পারেন
KARTHI SRV

4

এই ফাংশনটি ব্যবহার করুন:

function searchThroughArray($search,array $lists){
        try{
            foreach ($lists as $key => $value) {
                if(is_array($value)){
                    array_walk_recursive($value, function($v, $k) use($search ,$key,$value,&$val){
                        if(strpos($v, $search) !== false )  $val[$key]=$value;
                    });
            }else{
                    if(strpos($value, $search) !== false )  $val[$key]=$value;
                }

            }
            return $val;

        }catch (Exception $e) {
            return false;
        }
    }

এবং কল ফাংশন।

print_r(searchThroughArray('breville-one-touch-tea-maker-BTM800XL',$products));

চমৎকার উত্তর. আপনি আমার উত্তরের প্রস্তাবের কার্যকারিতা পরীক্ষা করতে পারেন
ইভান রোড্রিগেজ টরেস

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

1
function search($array, $key, $value) 
{ 
    $results = array(); 

    if (is_array($array)) 
    { 
        if (isset($array[$key]) && $array[$key] == $value) 
            $results[] = $array; 

        foreach ($array as $subarray) 
            $results = array_merge($results, search($subarray, $key, $value)); 
    } 

    return $results; 
} 

কোড-কেবলমাত্র উত্তরগুলি স্ট্যাকওভারফ্লোতে কম মান। আপনার পুনরাবৃত্ত পদ্ধতিটি কীভাবে কাজ করে, যথাযথ পরিস্থিতি এবং পুনরাবৃত্তি অপ্রয়োজনীয় ওভারহেডের পরিস্থিতিগুলি বোঝাতে দয়া করে আপনার পোস্টটি আপডেট করুন। ওপি এবং আরও বৃহত্তর এসও দর্শকদের শিক্ষিত করার অভিপ্রায় সহ সর্বদা উত্তর পোস্ট করুন।
মিকম্যাকুসা

1

পরবর্তী দর্শকদের সাথে আসার জন্য: পুনরাবৃত্তির অ্যারে হাঁটা ব্যবহার করুন; এটি বহুমাত্রিক অ্যারেতে প্রতিটি "পাতায়" যায়। অনুপ্রেরণার জন্য এখানে:

function getMDArrayValueByKey($a, $k) {
    $r = [];
    array_walk_recursive ($a, 
                          function ($item, $key) use ($k, &$r) {if ($key == $k) $r[] = $item;}
                          );
    return $r;
}

সমস্যা নেই! আপনার সময় বাঁচাতে আপনি যদি জোসেফের উত্তরটি চেষ্টা করেন তবে ফাংশনটি একটি উপাদান সহ একটি অ্যারে প্রদান করে।
মূলটি

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

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

1

আমি নীচের মতো করব, যেখানে $productsপ্রথমদিকে সমস্যাটি দেওয়া হয়েছিল আসল অ্যারেটি।

print_r(
  array_search("breville-variable-temperature-kettle-BKE820XL", 
  array_map(function($product){return $product["slug"];},$products))
);

0

এটা চেষ্টা কর

function recursive_array_search($needle,$haystack) {
        foreach($haystack as $key=>$value) {
            $current_key=$key;
            if($needle==$value['uid'] OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
                return $current_key;
            }
        }
        return false;
    }

কোড-কেবলমাত্র উত্তরগুলি স্ট্যাকওভারফ্লোতে কম মান। আপনার পুনরাবৃত্ত পদ্ধতিটি কীভাবে কাজ করে, যথাযথ পরিস্থিতি এবং পুনরাবৃত্তি অপ্রয়োজনীয় ওভারহেডের পরিস্থিতিগুলি বোঝাতে দয়া করে আপনার পোস্টটি আপডেট করুন। ওপি এবং আরও বৃহত্তর এসও দর্শকদের শিক্ষিত করার অভিপ্রায় সহ সর্বদা উত্তর পোস্ট করুন। গীত আমি মনে করি সবচেয়ে পিএইচপি ডেভেলপারদের পছন্দ করবে &&এবং ||পরিবর্তে ANDএবং ORআপনার অবস্থায়। ঘোষণা করার কোনও কারণ নেই current_key। তুলনা $needleকঠোর হতে হবে।
মিকম্যাকুসা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.