2011-10-08 7 views
11

array_filter - एक कॉलबैक फ़ंक्शन का उपयोग करPHP array_filter, कॉलबैक में कुंजी कैसे प्राप्त करें?

सरणी array_filter (सरणी $ इनपुट [, कॉलबैक $ कॉलबैक])

वर्तमान सरणी मूल्य की कुंजी प्राप्त कॉलबैक कर सकते हैं और कैसे एक सरणी के तत्वों फ़िल्टर ?

उत्तर

0

आप के रूप में यहाँ पर चर्चा की array_walk समारोह इस्तेमाल कर सकते हैं (3 जवाब नीचे): is it possible if callback in array_filter receive parameter?

+0

बहुत मुश्किल है, और मैं अनुक्रमित लोगों के साथ अनुक्रमित सरणी के साथ काम कर रहा हूं। उस समाधान कुंजी में हार्डकोडेड हैं। – gremo

+1

शायद एक और मानक 'कोड'foreach ($ arr = $ $ के रूप में $ arr = {$ val) {} कार्यान्वयन आपकी आवश्यकताओं को पूरा करेगा। – jondbaker

+0

मुझे इनपुट सरणी फ़िल्टर करने की आवश्यकता है: यदि कुंजी किसी अन्य सरणी में मौजूद है तो तत्व को वापस करें। मुझे उम्मीदवार 'array_filter' मिला लेकिन मुझे कॉलबैक में वर्तमान सरणी मान की कुंजी नहीं मिल सकती है। – gremo

7

एक पिछली टिप्पणी आप उल्लिखित आप वास्तव में कुछ इस तरह की तलाश कर रहे हैं:

foreach ($t as $k => $v) 
    if (!array_key_exists($k, $valid)) 
     unset($t[$k]) 
तो वास्तव में

को सरणी $t से सभी मानों को हटाएं जिनके पास सरणी $valid में कोई कुंजी नहीं है।

इसके लिए PHP फ़ंक्शन को array_intersect_key कहा जाता है। चौराहे फ़िल्टर किए गए परिणाम के बराबर है:

$filtered = array_intersect_key($t, $valid); 
3

वहाँ array_filter पहुँच तत्व के प्रमुख के कॉलबैक जाने के लिए कोई रास्ता नहीं है, और न ही वहाँ एक समान कार्य करता है कि आप क्या चाहते है।

हालांकि, आप अपने खुद के समारोह इस के लिए नीचे दिए गए एक की तरह लिख सकते हैं:

function arrayfilter(array $array, callable $callback = null) { 
    if ($callback == null) { 
     $callback = function($key, $val) { 
      return (bool) $val; 
     }; 
    } 
    $return = array(); 
    foreach ($array as $key => $val) { 
     if ($callback($key, $val)) { 
      $return[$key] = $val; 
     } 
    } 
    return $return; 
} 

$test_array = array('foo', 'a' => 'the a', 'b' => 'the b', 11 => 1101, '', null, false, 0); 

$array = arrayfilter($test_array, function($key, $val) { 
    return is_string($key); 
}); 
print_r($array); 
/* 
Array 
(
    [a] => the a 
    [b] => the b 
) 
*/ 

$array = arrayfilter($test_array); 
print_r($array); 
/* 
Array 
(
    [0] => foo 
    [a] => the a 
    [b] => the b 
    [11] => 1101 
) 
*/ 
0

मेरे पास अन्य विकल्प यहाँ सुझाव पसंद नहीं था, अगर किसी और को इस सुविधा के लिए लग रही है, यहाँ एक है त्वरित कार्यान्वयन:

function array_filter_keys($a, $c){ 
    $i=array_filter(array_keys($a), $c); 
    return array_intersect_key($a, array_flip($i)); 
} 

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

संपादित करें: यह कुछ अन्य टिप्पणियों को पढ़ने के बाद अस्वीकरण का अधिक है, मुझे एहसास है कि ओपी वास्तव में केवल array_intersect की तलाश में है, जैसा हैकर ने बताया। मैं इस सवाल का जवाब यहाँ छोड़ देंगे, हालांकि बाद ऑप्स सवाल स्पष्ट रूप से है कि जरूरत नहीं बताता है और इस पृष्ठ array_filter_keys

9
प्रलेखन से

के लिए गूगल में दिखाई देता है: पीएचपी 5.6.0 जोड़ा वैकल्पिक ध्वज पैरामीटर और स्थिरांक ARRAY_FILTER_USE_KEY और

ARRAY_FILTER_USE_BOTH

संबंधित मुद्दे