दिलचस्प पोस्ट
मैट्रिक्स में कई बिंदुओं के मूल्यों को मैं कैसे बदल सकता हूँ? टर्नरी ऑपरेटर वीबी बनाम सी #: शून्य से कुछ क्यों हल करता है? JSF-Richfaces-facelet में सत्र समयबाह्य पर पुनर्निर्देशन jQuery – स्टिकी हेडर जो नीचे स्क्रॉल करते समय छोटा हो जाता है पैसे से निपटने के लिए क्या मुझे NSDecimalNumber का उपयोग करना चाहिए? फ़ायरफ़ॉक्स में एक चुनिंदा तत्व से तीर कैसे निकालें चारों ओर तर्कों की चर संख्या पास करना एमवीसी 5 गतिशील पंक्तियों के साथ शुरूआती चयन आईटम सीधे मेरी एंड्रॉइड एप्लिकेशन में ZXing लाइब्रेरी को एकीकृत करना TextView पर फ़ॉन्ट कैसे बदल सकता है? UICollectionView की अंतिम पंक्ति समायोजित करें एलआरयू कैश डिज़ाइन सीएसएस छवि खुद का आकार प्रतिशत? क्लाइंट / सर्वर ग्राकेशंस वर्तमान / कीबोर्ड के प्रतिशत / सेट कीफ़्र्रेम चालू करें / सेट करें

PHP: array_filter () का उपयोग करने के लिए सरणी कुंजी फ़िल्टर करने के लिए?

array_filter() में कॉलबैक फ़ंक्शन केवल सरणी के मान में गुजरता है, चाबियाँ नहीं

अगर मेरे पास:

 $my_array = array("foo" => 1, "hello" => "world"); $allowed = array("foo", "bar"); 

$my_array में सभी कुंजी को हटाने का सबसे अच्छा तरीका क्या है जो $allowed सरणी में नहीं हैं?

वांछित आउटपुट:

 $my_array = array("foo" => 1); 

Solutions Collecting From Web of "PHP: array_filter () का उपयोग करने के लिए सरणी कुंजी फ़िल्टर करने के लिए?"

PHP 5.6 ने array_filter() , flag लिए एक तीसरा पैरामीटर प्रस्तुत किया है, जिसे आप मान के बदले कुंजी द्वारा फ़िल्टर करने के लिए ARRAY_FILTER_USE_KEY पर सेट कर सकते हैं:

 $my_array = ['foo' => 1, 'hello' => 'world']; $allowed = ['foo', 'bar']; $filtered = array_filter( $my_array, function ($key) use ($allowed) { return in_array($key, $allowed); }, ARRAY_FILTER_USE_KEY ); 

स्पष्ट रूप से यह array_intersect_key($my_array, array_flip($allowed)) रूप में सुरुचिपूर्ण नहीं है, लेकिन यह कुंजी के खिलाफ एक मनमाना परीक्षण करने की अतिरिक्त लचीलेपन की पेशकश करता है, जैसे कि $allowed सादे तारों के बजाय regex पैटर्न हो सकते हैं।

आप अपने फ़िल्टर फ़ंक्शन के लिए मूल्य और कुंजी को पास करने के लिए ARRAY_FILTER_USE_BOTH का उपयोग भी कर सकते हैं। यहां पर पहले के आधार पर एक अनुमानित उदाहरण दिया गया है, लेकिन ध्यान दें कि मैं इस तरह $allowed उपयोग से फ़िल्टरिंग नियमों को एन्कोडिंग करने की अनुशंसा नहीं करता हूं:

 $my_array = ['foo' => 1, 'bar' => 'baz', 'hello' => 'wld']; $allowed = ['foo' => true, 'bar' => true, 'hello' => 'world']; $filtered = array_filter( $my_array, function ($val, $key) use ($allowed) { // Nb $val, $key not $key, $val return isset($allowed[$key]) && ( $allowed[$key] === true || $allowed[$key] === $val ); }, ARRAY_FILTER_USE_BOTH ); // ['foo' => 1, 'bar' => 'baz'] 

array_intersect_key और array_flip :

 var_dump(array_intersect_key($my_array, array_flip($allowed))); array(1) { ["foo"]=> int(1) } 

मुझे ऐसा करने की आवश्यकता थी, लेकिन array_filter पर अधिक जटिल array_filter साथ।

यहाँ एक समान विधि का उपयोग करते हुए, मैंने इसे कैसे किया?

 // Filter out array elements with keys shorter than 4 characters $a = array( 0 => "val 0", "one" => "val one", "two" => "val two", "three"=> "val three", "four" => "val four", "five" => "val five", "6" => "val 6" ); $f = array_filter(array_keys($a), function ($k){ return strlen($k)>=4; }); $b = array_intersect_key($a, array_flip($f)); print_r($b); 

यह परिणाम को आउटपुट करता है:

 Array ( [three] => val three [four] => val four [five] => val five ) 

क्लोजर का उपयोग करते हुए यहां अधिक लचीला समाधान है:

 $my_array = array("foo" => 1, "hello" => "world"); $allowed = array("foo", "bar"); $result = array_flip(array_filter(array_flip($my_array), function ($key) use ($allowed) { return in_array($key, $allowed); })); var_dump($result); 

आउटपुट:

 array(1) { 'foo' => int(1) } 

तो फ़ंक्शन में, आप अन्य विशिष्ट परीक्षण कर सकते हैं।

array_filter का उपयोग करते समय सरणी की वर्तमान कुंजी कैसे प्राप्त करें

चाहे मुझे array_filter की समस्या के लिए विन्सेन्ट का समाधान पसंद न हो, यह वास्तव में array_filter उपयोग नहीं करता है यदि आप यहां एक खोज इंजन से आए हैं, तो शायद आप ऐसा कुछ ( PHP> 5.3 = ) की तलाश कर रहे हैं।

 $array = ['apple' => 'red', 'pear' => 'green']; reset($array); // Unimportant here, but make sure your array is reset $apples = array_filter($array, function($color) use ($&array) { $key = key($array); next($array); // advance array pointer return key($array) === 'apple'; } 

यह आपके द्वारा कॉलबैक के संदर्भ के रूप में फ़िल्टर कर रहे सरणी से गुजरता है। जैसा कि array_filter पारंपरिक आंतरिक सूचक को बढ़ाकर सरणी के ऊपर पारंपरिक रूप से पुनरावृत्त नहीं करता है, इसलिए आपको इसे अपने द्वारा अग्रिम कर देना होगा।

यहाँ क्या महत्वपूर्ण है कि आपको यह सुनिश्चित करने की ज़रूरत है कि आपका ऐरे रीसेट हो गया है, अन्यथा आप इसके ठीक मध्य में शुरू हो सकते हैं।

PHP> = 5.4 में आप कॉलबैक को भी कम कर सकते हैं:

 $apples = array_filter($array, function($color) use ($&array) { return each($array)['key'] === 'apple'; } 

अनसेट () का उपयोग करने वाला यह एक कम लचीला विकल्प है:

 $array = array( 1 => 'one', 2 => 'two', 3 => 'three' ); $disallowed = array(1,3); foreach($disallowed as $key){ unset($array[$key]); } 

print_r($array) का नतीजा:

 Array ( [2] => two ) 

यह लागू नहीं है यदि आप बाद के उपयोग के लिए फ़िल्टर्ड मान रखना चाहते हैं, लेकिन यदि आप निश्चित हैं कि आप ऐसा नहीं करते हैं

यदि आप एक सरणी को कुंजियों में होने वाली स्ट्रिंग से फ़िल्टर करने के लिए एक विधि की तलाश कर रहे हैं, तो आप इसका उपयोग कर सकते हैं:

 $mArray=array('foo'=>'bar','foo2'=>'bar2','fooToo'=>'bar3','baz'=>'nope'); $mSearch='foo'; $allowed=array_filter( array_keys($mArray), function($key) use ($mSearch){ return stristr($key,$mSearch); }); $mResult=array_intersect_key($mArray,array_flip($allowed)); 

print_r($mResult) का परिणाम print_r($mResult) है

 Array ( [foo] => bar [foo2] => bar2 [fooToo] => bar3 ) 

इस जवाब का एक adaption जो नियमित अभिव्यक्तियों का समर्थन करता है

 function array_preg_filter_keys($arr, $regexp) { $keys = array_keys($arr); $match = array_filter($keys, function($k) use($regexp) { return preg_match($regexp, $k) === 1; }); return array_intersect_key($arr, array_flip($match)); } $mArray = array('foo'=>'yes', 'foo2'=>'yes', 'FooToo'=>'yes', 'baz'=>'nope'); print_r(array_preg_filter_keys($mArray, "/^foo/i")); 

उत्पादन

 Array ( [foo] => yes [foo2] => yes [FooToo] => yes ) 

अगर आपको इसकी आवश्यकता होती है तो शायद एक ओवरकिल हो, लेकिन आप संग्रह को फ़िल्टर करने के लिए YaLinqo लाइब्रेरी * का उपयोग कर सकते हैं (और कोई भी अन्य परिवर्तन)। यह लाइब्रेरी फ्लेक्सिंग एसक्यूएल की तरह एक्स्टेंसिव के साथ ऑब्जेक्ट के साथ ऑब्जेक्ट की अनुमति देता है। इसका कार्य where दो तर्कों के साथ एक कैबैक को स्वीकार करता है: एक मान और एक कुंजी उदाहरण के लिए:

 $filtered = from($array) ->where(function ($v, $k) use ($allowed) { return in_array($k, $allowed); }) ->toArray(); 

( where फ़ंक्शन एक इटरेटर देता है, इसलिए यदि आपको केवल एक बार परिणामी अनुक्रमों पर अग्र के साथ पुनरावृत्त करने की आवश्यकता होती है, ->toArray() को हटाया जा सकता है।)

* मेरे द्वारा विकसित

PHP 5.6 से शुरू, आप ARRAY_FILTER_USE_KEY में ARRAY_FILTER_USE_KEY फ़्लैग का उपयोग कर सकते हैं:

 $result = array_filter($my_array, function ($k) use ($allowed) { return in_array($k, $allowed); }, ARRAY_FILTER_USE_KEY); 

अन्यथा, आप इस समारोह ( टेस्ट डम्मी से ) का उपयोग कर सकते हैं:

 function filter_array_keys(array $array, $callback) { $matchedKeys = array_filter(array_keys($array), $callback); return array_intersect_key($array, array_flip($matchedKeys)); } $result = filter_array_keys($my_array, function ($k) use ($allowed) { return in_array($k, $allowed); }); 

और यहाँ मेरा एक संवर्धित संस्करण है, जो कॉलबैक स्वीकार करता है या सीधे चाबियाँ:

 function filter_array_keys(array $array, $keys) { if (is_callable($keys)) { $keys = array_filter(array_keys($array), $keys); } return array_intersect_key($array, array_flip($keys)); } // using a callback, like array_filter: $result = filter_array_keys($my_array, function ($k) use ($allowed) { return in_array($k, $allowed); }); // or, if you already have the keys: $result = filter_array_keys($my_array, $allowed)); 

अंतिम लेकिन कम से कम, आप एक सरल foreach प्रयोग भी कर सकते हैं:

 $result = []; foreach ($my_array as $key => $value) { if (in_array($key, $allowed)) { $result[$key] = $value; } } 

इस फ़ंक्शन के साथ आप एक बहुआयामी सरणी को फ़िल्टर कर सकते हैं

 function filter_array_keys($array,$filter_keys=array()){ $l=array(&$array); $c=1; //This first loop will loop until the count var is stable// for($r=0;$r<$c;$r++){ //This loop will loop thru the child element list// $keys = array_keys($l[$r]); for($z=0;$z<count($l[$r]);$z++){ $object = &$l[$r][$keys[$z]]; if(is_array($object)){ $i=0; $keys_on_array=array_keys($object); $object=array_filter($object,function($el) use(&$i,$keys_on_array,$filter_keys){ $key = $keys_on_array[$i]; $i++; if(in_array($key,$filter_keys) || is_int($key))return false; return true; }); } if(is_array($l[$r][$keys[$z]])){ $l[] = &$l[$r][$keys[$z]]; $c++; }//IF }//FOR }//FOR return $l[0]; } 

सरणी फिल्टर फ़ंक्शन php से:

 array_filter ( $array, $callback_function, $flag ) 

$ सरणी – यह इनपुट सरणी है

$ callback_function – कॉलबैक फ़ंक्शन का उपयोग करने के लिए, यदि कॉलबैक फ़ंक्शन रिटर्न सही होता है , तो सरणी से मौजूदा मान को परिणाम सरणी में लौटा दिया जाता है।

$ फ्लैग – यह वैकल्पिक पैरामीटर है , यह तय करेगा कि कॉलबैक फ़ंक्शन के लिए कौन-सी तर्क भेजे जाते हैं। यदि यह पैरामीटर खाली है तो कॉलबैक फ़ंक्शन तर्क के रूप में सरणी मान लेगा। यदि आप तर्क के रूप में सरणी कुंजी भेजना चाहते हैं तो ARRAY_FILTER_USE_KEY के रूप में $ फ़्लैग का उपयोग करें। अगर आप दोनों चाबियाँ और मूल्य भेजना चाहते हैं तो आपको ARRAY_FILTER_USE_BOTH के रूप में $ फ़्लैग का उपयोग करना चाहिए।

उदाहरण के लिए: सरल सरणी पर गौर करें

 $array = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); 

यदि आप सरणी कुंजी के आधार पर सरणी फ़िल्टर करना चाहते हैं, तो हमें ARRAY_FILTER_USE_KEY को अरै फ़ंक्शन array_filter के तीसरे पैरामीटर के रूप में उपयोग करना होगा।

 $get_key_res = array_filter($array,"get_key",ARRAY_FILTER_USE_KEY ); 

यदि आप सरणी कुंजी और सरणी मान पर आधारित सरणी फ़िल्टर करना चाहते हैं, तो हमें ARRAY_FILTER_USE_BOTH को अरै फ़ंक्शन array_filter के तीसरे पैरामीटर के रूप में उपयोग करने की आवश्यकता है

 $get_both = array_filter($array,"get_both",ARRAY_FILTER_USE_BOTH ); 

नमूना कॉलबैक फ़ंक्शंस:

  function get_key($key) { if($key == 'a') { return true; } else { return false; } } function get_both($val,$key) { if($key == 'a' && $val == 1) { return true; } else { return false; } } 

यह उत्पादन होगा

 Output of $get_key is :Array ( [a] => 1 ) Output of $get_both is :Array ( [a] => 1 ) 

// 4 अक्षरों से कम कुंजी के साथ सरणी तत्वों को फ़िल्टर करें // बंद करने के साथ बेनामी फ़ंक्शन का उपयोग करके …

 function comparison($min) { return function($item) use ($min) { return strlen($item) >= $min; }; } $input = array( 0 => "val 0", "one" => "val one", "two" => "val two", "three"=> "val three", "four" => "val four", "five" => "val five", "6" => "val 6" ); 

$ आउटपुट = array_filter (array_keys ($ इनपुट), तुलना (4));

print_r ($ उत्पादन);
यहां छवि विवरण दर्ज करें