পিএইচপি - একটি অ্যারে থেকে সমস্ত কীগুলি পান যা একটি নির্দিষ্ট স্ট্রিং দিয়ে শুরু হয়


84

আমার দেখতে এমন অ্যারে রয়েছে যা দেখতে দেখতে:

array(
  'abc' => 0,
  'foo-bcd' => 1,
  'foo-def' => 1,
  'foo-xyz' => 0,
  // ...
)

আমি কেবল যে উপাদানগুলি দিয়ে শুরু করব সেগুলি কীভাবে পাব foo-?


4
এর মতো উপসর্গযুক্ত একটি অ্যারে থাকা কোড গন্ধ। এই মানগুলিকে ধারণ করে এমন কোনও বস্তুতে এই মানগুলি বের করুন বা কমপক্ষে একটি অ্যারেতে উপসর্গ বিন্দু করুন এবং এর সাথে মান যুক্ত করুন।
গর্ডন

উত্তর:


20
$arr_main_array = array('foo-test' => 123, 'other-test' => 456, 'foo-result' => 789);

foreach($arr_main_array as $key => $value){
    $exp_key = explode('-', $key);
    if($exp_key[0] == 'foo'){
         $arr_result[] = $value;
    }
}

if(isset($arr_result)){
    print_r($arr_result);
}

18
আপনি এই সমাধানটি নেওয়ার আগে নীচের দিক থেকে একটি ভাল। সরল স্ট্রিং ফাংশন যথেষ্ট হবে যেখানে অ্যারে ফাংশন কখনও ব্যবহার করবেন না। স্ট্রিং ফাংশনগুলি ওয়ে ওয়ে। এটি বড় অ্যারে সহ 'ল্যাগ' করবে।
মার্টিজন

4
অ্যারেগুলিতে অ্যারের কীগুলি বিস্ফোরিত করার বিন্দু আমি দেখতে পাচ্ছি না। তারা স্ট্রিং এবং মূল প্রশ্নটি কেবল একটি স্ট্রিং উপসর্গ সম্পর্কে জিজ্ঞাসা করছে। এছাড়াও ওপি কেবলমাত্র মানগুলির পরিবর্তে "উপাদানগুলির" জন্য জিজ্ঞাসা করছে, সুতরাং সংখ্যার-সূচকযুক্ত ফলাফলটি অকেজো হতে চলেছে - কীগুলি এখানে স্পষ্টভাবে গুরুত্বপূর্ণ, মানগুলি (সম্ভবত) বেনামে 1/0 পতাকা রয়েছে।
জেসন

127

কার্যকরী পদ্ধতির:

Http://php.net/array_filterarray_filter_key এ মন্তব্যগুলি থেকে এক ধরণের ফাংশন তুলে নিন বা আপনার নিজের লিখুন। তাহলে আপনি করতে পারেন:

$array = array_filter_key($array, function($key) {
    return strpos($key, 'foo-') === 0;
});

পদ্ধতিগত পদ্ধতির:

$only_foo = array();
foreach ($array as $key => $value) {
    if (strpos($key, 'foo-') === 0) {
        $only_foo[$key] = $value;
    }
}

অবজেক্ট ব্যবহার করে পদ্ধতিগত পদ্ধতি:

$i = new ArrayIterator($array);
$only_foo = array();
while ($i->valid()) {
    if (strpos($i->key(), 'foo-') === 0) {
        $only_foo[$i->key()] = $i->current();
    }
    $i->next();
}

20
দ্রষ্টব্য পিএইচপি 5.6 এ ARRAY_FILTER_USE_KEY পতাকা যুক্ত করেছে array_filter(), যা আপনি কাস্টম array_filter_key()ফাংশন সরবরাহের পরিবর্তে ব্যবহার করতে পারেন ।
জেসন

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

38

এইভাবে আমি এটি করব, যদিও আপনি যে মূল্যবোধগুলি পাবেন সেগুলি বোঝার আগে আমি আপনাকে আরও কার্যকর পরামর্শ দিতে পারি না।

$search = "foo-";
$search_length = strlen($search);
foreach ($array as $key => $value) {
    if (substr($key, 0, $search_length) == $search) {
        ...use the $value...
    }
}

4
আপনি এটিও ব্যবহার করতে পারেন:foreach ($array as $key => $value) { if (0 === strpos($key, 'foo-')) { ...use the $value... } }
আইগো

এখানে "4" দৈর্ঘ্য "foo-" এর সাথে সামঞ্জস্য করা দরকার।
জেসন

22

সহজভাবে আমি array_filterনীচের মতো সমাধানটি অর্জন করতে ফাংশনটি ব্যবহার করেছি

<?php

$input = array(
    'abc' => 0,
    'foo-bcd' => 1,
    'foo-def' => 1,
    'foo-xyz' => 0,
);

$filtered = array_filter($input, function ($key) {
    return strpos($key, 'foo-') === 0;
}, ARRAY_FILTER_USE_KEY);

print_r($filtered);

আউটপুট

Array
(
    [foo-bcd] => 1
    [foo-def] => 1
    [foo-xyz] => 0
)

সরাসরি চেকের জন্য https://3v4l.org/lJCse


4
মনোযোগ দিন যে এর জন্য কমপক্ষে PHP 5.6.0 প্রয়োজন (ধ্রুবক ARRAY_FILTER_USE_KEY ব্যবহারের কারণে)। পূর্ববর্তী সংস্করণগুলিতে আপনি ব্যবহার করতে পারেন: [কোড]
নেটসুরফার

20

পিএইচপি 5.3 থেকে আপনি preg_filterফাংশনটি ব্যবহার করতে পারেন : এখানে

$unprefixed_keys = preg_filter('/^foo-(.*)/', '$1', array_keys( $arr ));

// Result:
// $unprefixed_keys === array('bcd','def','xyz')

14
foreach($arr as $key => $value)
{
   if(preg_match('/^foo-/', $key))
   {
        // You can access $value or create a new array based off these values
   }
}

4
এই ক্ষেত্রে একটি রেজেক্স সত্যই প্রয়োজনীয় নয়। সাবস্ট্রাস্ট পদ্ধতিটি আরও কিছুটা দক্ষ
jfoucher

4
@ জেফৌচার: এটি সত্য, তবে ব্যক্তিগতভাবে এটি পড়া সহজ।
টিম কুপার

4
এটি আরও নমনীয় হতে পারে তবে আপনি যদি নিয়মিত এক্সপ্রেশন ম্যাচ না করতে চান তবে বিশেষ প্রাগ অক্ষরগুলি থেকে বাঁচতে পারা প্রয়োজন । তাই সাবধানতার সাথে ব্যবহার করুন। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আরইএস দরকার হলে কেবলই আরইএস ব্যবহার করুন।
জেসন

7

এরিকোতে পরিবর্তন এর প্রায়োগিক পদ্ধতি,

array_filter($signatureData[0]["foo-"], function($k) {
    return strpos($k, 'foo-abc') === 0;
}, ARRAY_FILTER_USE_KEY);

এটি আমার জন্য কাজ করেছে।


@Erisco দ্বারা সরবরাহ করা অ্যারে_ফিল্টার_কি সংস্করণের সাথে তুলনা করে পারফরম্যান্স বা উপযোগিতার কোনও পার্থক্য?
ম্যাকিক সেমিক

নাহ। আমার অনুমান পারফরম্যান্সে কোনও পার্থক্য থাকা উচিত নয়। @ ম্যাসিকসেমিক
কিউর

4
এটি একটি মূল পিএইচপি ফাংশন তাই এটি পছন্দ করা উচিত।
জেরেমি জন

2

উপরে সুরেশ ভেলুসামির উত্তর ছাড়াও (যার কমপক্ষে পিএইচপি 5.6.0 প্রয়োজন) আপনি পিএইচপি এর পূর্ববর্তী সংস্করণে থাকলে নিম্নলিখিতটি ব্যবহার করতে পারেন:

<?php

$input = array(
    'abc' => 0,
    'foo-bcd' => 1,
    'foo-def' => 1,
    'foo-xyz' => 0,
);

$filtered = array_filter(array_keys($input), function($key) {
    return strpos($key, 'foo-') === 0;
});

print_r($filtered);

/* Output:
Array
(
    [1] => foo-bcd
    [2] => foo-def
    [3] => foo-xyz
)
// the numerical array keys are the position in the original array!
*/

// if you want your array newly numbered just add:
$filtered = array_values($filtered);

print_r($filtered);

/* Output:
Array
(
    [0] => foo-bcd
    [1] => foo-def
    [2] => foo-xyz
)
*/

4
দয়া করে নোট করুন (বা কমপক্ষে আমার জন্য) যে এটি কেবল অ্যারে কীটির সেই ম্যাচটি দেয় returns @ সুরেশ-ভেলুসামির নীচের উত্তরটি মূল $key => $valueজুটির সাথে প্রকৃত অ্যারেটি বের করে । এটি এই উত্তরের আউটপুটে বলা হয়েছে, তবে এখনও স্পষ্টভাবে উল্লেখ করা হয়নি
মার্টি

0

PHP5.6 থেকে, অ্যারের কীগুলি ARRAY_FILTER_USE_KEY ধ্রুবক / পতাকা ব্যবহার করে পরিস্রাবণের একমাত্র বিষয় হতে পারে ।

PHP7.4 থেকে, তীর ফাংশনগুলি কাস্টম ফাংশনগুলিকে আরও সংক্ষিপ্ত করে তোলে এবং মানগুলি ব্যতীত কাস্টম ফাংশনের স্কোপে প্রবেশের অনুমতি দেয় use()

পিএইচপি 8 থেকে, str_starts_with () এর স্থান নিতে পারেstrpos(...) === 0

কোড: ( ডেমো )

$array = [
  'abc' => 0,
  'foo-bcd' => 1,
  'foo-def' => 1,
  'foo-xyz' => 0,
];

$prefix = 'foo';

var_export(
    array_filter(
        $array,
        fn($key) => str_starts_with($key, $prefix),
        ARRAY_FILTER_USE_KEY
    )
);

আউটপুট:

array (
  'foo-bcd' => 1,
  'foo-def' => 1,
  'foo-xyz' => 0,
)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.