PHP - एक सरणी से सभी चाबियाँ प्राप्त करें जो एक निश्चित स्ट्रिंग से शुरू होती हैं


84

मेरे पास एक सरणी है जो इस तरह दिखता है:

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

मैं केवल उन तत्वों को कैसे प्राप्त कर सकता हूं जिनके साथ शुरू होता है foo-?


3
इस तरह के उपसर्गों के साथ एक सरणी होने से एक कोड गंध है। इन मूल्यों को धारण करने वाले ऑब्जेक्ट में उन मानों को निकालें या कम से कम एक सरणी में उपसर्ग बिंदु बनाएं और इसमें मान जोड़ें।
गॉर्डन

इन्हें भी देखें: stackoverflow.com/questions/13766898/…
dreftymac

जवाबों:


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
इससे पहले कि आप इस घोल को लें, नीचे वाला बेहतर है। उन सरणी फ़ंक्शंस का उपयोग कभी न करें जहां सरल स्ट्रिंग फ़ंक्शन पर्याप्त होगा। स्ट्रिंग फ़ंक्शंस तेज़ हैं। यह बड़े सरणियों के साथ 'अंतराल' होगा।
मार्टिज़न

2
मैं सरणी कुंजियों को सरणियों में विस्फोट करने का बिंदु नहीं देखता। वे तार हैं और मूल प्रश्न सिर्फ एक स्ट्रिंग उपसर्ग के बारे में पूछ रहा है। साथ ही ओपी केवल मूल्यों के बजाय "तत्वों" के लिए पूछ रहा है, इसलिए संख्यात्मक रूप से अनुक्रमित परिणाम बेकार होने वाला है - कुंजी यहां स्पष्ट रूप से महत्वपूर्ण हैं, मूल्यों के साथ (संभवतः) अनाम 1/0 झंडे हैं।
जेसन

126

कार्यात्मक दृष्टिकोण:

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
नोट PHP 5.6 ARRAY_FILTER_USE_KEY ध्वज को जोड़ता है array_filter(), जिसका उपयोग आप कस्टम array_filter_key()फ़ंक्शन की आपूर्ति करने के बजाय कर सकते हैं ।
जेसन

4
क्या आप कृपया अपने उदाहरण में array_filter_key फ़ंक्शन जोड़ सकते हैं? मुझे एक त्रुटि मिलती रही और मुझे अपनी गलती को पहचानने से पहले कई बार अपनी पोस्ट को फिर से पढ़ना पड़ा। केवल कोड पोस्ट करना, एक क्लिक सहेजना, और किसी समय समस्या निवारण को सहेजना मुश्किल नहीं है। धन्यवाद।
क्रिस स्प्रैग

38

यह है कि मैं इसे कैसे करूँगा, हालांकि मैं आपको यह समझने से पहले अधिक कुशल सलाह नहीं दे सकता कि आप जो मूल्य प्राप्त करते हैं, उसके साथ क्या करना चाहते हैं।

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

2
आप भी उपयोग कर सकते हैं:foreach ($array as $key => $value) { if (0 === strpos($key, 'foo-')) { ...use the $value... } }
Iago

यहां "4" को जो भी लंबाई "फू-" को समायोजित करने की आवश्यकता है।
जेसन

21

बस मैंने 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


1
ध्यान दें कि इसे कम से कम PHP 5.6.0 (निरंतर ARRAY_FILTER_USE_KEY के उपयोग के कारण) की आवश्यकता है। पूर्व संस्करणों में आप उपयोग कर सकते हैं: [कोड]
११ fer१ पर versions१

20

PHP 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
   }
}

3
इस मामले में एक regex वास्तव में आवश्यक नहीं है।
जड़

2
@jfoucher: यह सच है, हालांकि, व्यक्तिगत रूप से, यह पढ़ना आसान है।
टिम कूपर

2
यह अधिक लचीला हो सकता है, लेकिन यदि आप एक नियमित अभिव्यक्ति मैच नहीं करना चाहते हैं तो विशेष प्रीग वर्णों से बचने की आवश्यकता की कीमत पर आता है । इसलिए सावधानी के साथ प्रयोग करें। मैं आपको REs का उपयोग करने की सलाह दूंगा यदि आपको REs की आवश्यकता है।
जेसन

7

Erisco के कार्यात्मक दृष्टिकोण में संशोधन ,

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

यह मेरे लिए काम किया।


@Erisco द्वारा उपलब्ध कराई गई array_filter_key संस्करण की तुलना में प्रदर्शन या उपयोगिता में कोई अंतर है?
जेफरी जिराफ

नहीं। मुझे लगता है कि प्रदर्शन में कोई अंतर नहीं होना चाहिए। @MaciekSemik
Keyur

1
यह एक कोर PHP फ़ंक्शन है इसलिए इसे प्राथमिकता दी जानी चाहिए।
जेरेमी जॉन

3

ऊपर दिए गए @Suresh Velusamy के उत्तर के अलावा (जिसे कम से कम PHP 5.6.0 की आवश्यकता है) यदि आप PHP के एक पूर्व संस्करण पर हैं, तो आप निम्नलिखित का उपयोग कर सकते हैं:

<?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
)
*/

कृपया ध्यान दें (या कम से कम मेरे लिए) कि यह केवल सरणी कुंजी का मिलान लौटाता है। @ सुरेश-वेलुसामी द्वारा नीचे दिए गए उत्तर मूल $key => $valueजोड़ी के साथ वास्तविक सरणी को निकालते हैं । यह इस उत्तर के आउटपुट में बताया गया है, लेकिन अभी तक स्पष्ट रूप से उल्लेख नहीं किया गया है
मार्टी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.