2012-09-04 16 views
7

मैं date_compare() को शुरू करने के लिए एक फ़ंक्शन बनाने का प्रयास कर रहा हूं जो एक विशिष्ट सरणी और कुंजी के लिए usort फ़ंक्शन है।एक आंतरिक समारोह में फ़ंक्शन फ़ंक्शन पास करना?

function init_date_compare($key, $array) { 
    $key2 = $key; 
    function date_compare($a, $b) { 
     global $key2; 
     $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]); 
     return $t2 - $t1; 
    } 
    usort($array, "date_compare"); 
} 
$arr = array(array("Aug-2-2012"), array("June-2-2012")); 
$arr = init_date_compare(0, $arr); 
print_r($arr); 

यह आउटपुट:

Notice: Undefined index: in... 

(तो मूल रूप से अशक्त, scoping काम नहीं किया)।

मुझे यकीन नहीं है कि कार्यों के अंदर कार्यों के साथ कैसे काम करना है, लेकिन अगर मुझे सही याद है, तो यह संभव है। मैंने कुछ global एस में फेंकने की कोशिश की और $key2 शुरू किया लेकिन मैं इसे काम करने में असमर्थ हूं।

+0

उपयोगी होगा। –

उत्तर

4

आपका कोड काम नहीं कर रहा है क्योंकि global $key2;date_compare() फ़ंक्शन के अंदर इसे init_date_compare() के दायरे में नहीं देखेगा; बल्कि यह वैश्विक दायरे के अंदर इसे खोजने की उम्मीद करेगा।

इसके अलावा, या तो सरणी को संदर्भ पैरामीटर के माध्यम से संदर्भ (यानी &$array) द्वारा पारित किया जाना चाहिए, या सरणी से इसे वापस किया जाना चाहिए।

क्लोजर यह एक बहुत अच्छे (PHP> = 5.3) बनाना होगा:

function init_date_compare($key, &$array) 
{ 
    usort($array, function(array $a, array $b) use ($key) { 
     $t1 = strtotime($a[$key]); $t2 = strtotime($b[$key]); 
     return $t2 - $t1; 
    }); 
} 

एक और तरीका है एक वस्तु का उपयोग कर राज्य को संपुटित करने के लिए कर रहा है: कि जैक जवाब

class DateComparer 
{ 
    private $key; 

    public function __construct($key) 
    { 
     $this->key = $key; 
    } 

    public function compare(array $a, array $b) 
    { 
     $t1 = strtotime($a[$this->key]); $t2 = strtotime($b[$this->key]); 
     return $t2 - $t1; 
    } 
} 

function init_date_compare($key, &$array) 
{ 
    usort($array, array(new DateComparer($key), 'compare')); 
} 
+0

मुझे लगता है कि इस मामले में इतनी वैश्विक बेकार है। मैंने आपके पहले उदाहरण में पहले इस्तेमाल किए गए कोड को कभी नहीं देखा है, लेकिन अब मैं इसका परीक्षण करूंगा। –

+0

धन्यवाद यह काम किया! –

1
बेशक

चीजों को करने का सही तरीका है, लेकिन अगर आपको आश्चर्य हुआ कि यह पहली जगह क्यों नहीं काम करता है:
$key2 घोषित करना वैश्विक चर के रूप में केवल एक समस्या है, दूसरी समस्या यह है कि फ़ंक्शन init_date_compare फ़ोर नहीं देता है टेड सरणी
निम्नलिखित कोड काम करेगा: यदि `usort` और उसके परिजन, कॉलबैक करने के लिए तर्क दे सकते हैं हाँ

$key2=0; 

function init_date_compare($key, $array) { 
    global $key2; 
    $key2 = $key; 
    function date_compare($a, $b) { 
     //global $key2; 
     $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]); 
     return $t2 - $t1; 
    } 
    usort($array, "date_compare"); 
    return $array; 
} 
$arr = array(array("Aug-2-2012"), array("June-2-2012")); 
$arr = init_date_compare(0, $arr); 
print_r($arr); 
+0

धन्यवाद, मैंने कभी इसके बारे में सोचा नहीं। –

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