एक कक्षा निजी समारोह के साथ php में usort का उपयोग करना


119

एक फ़ंक्शन के साथ usort का उपयोग करना ठीक नहीं है, इतना जटिल नहीं है

यह वही है जो मैंने अपने रैखिक कोड में पहले किया था

function merchantSort($a,$b){
    return ....// stuff;
}

$array = array('..','..','..');

सॉर्ट करने के लिए मैं बस करते हैं

usort($array,"merchantSort");

अब हम कोड को अपग्रेड कर रहे हैं और सभी वैश्विक कार्यों को हटाकर उन्हें उनके उपयुक्त स्थान पर रख रहे हैं। अब सभी कोड एक कक्षा में हैं और मैं यह पता नहीं लगा सकता कि एक साधारण फ़ंक्शन के बजाय ऑब्जेक्ट के साथ सरणी को सॉर्ट करने के लिए usort फ़ंक्शन का उपयोग कैसे करें

class ClassName {
   ...

   private function merchantSort($a,$b) {
       return ...// the sort
   }

   public function doSomeWork() {
   ...
       $array = $this->someThingThatReturnAnArray();
       usort($array,'$this->merchantSort'); // ??? this is the part i can't figure out
   ...

   }
}

सवाल यह है कि मैं usort () फ़ंक्शन के अंदर ऑब्जेक्ट विधि कैसे कहता हूं

जवाबों:


228

अपने क्रमबद्ध कार्य को स्थिर बनाएं:

private static function merchantSort($a,$b) {
       return ...// the sort
}

और दूसरे पैरामीटर के लिए एक सरणी का उपयोग करें:

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));

2
यह भी खूब रही! मैं यह भी बताना चाहता हूं कि सॉर्ट फ़ंक्शन को एक स्टैटिक विधि के रूप में स्पष्ट रूप से घोषित नहीं किया जाना चाहिए ; जैसा कि यह अभी भी बिना काम करता है :)
जिम्बो

@ जिम्बो - जो समझ में आता है, इसलिए निजी फ़ंक्शन तात्कालिकता और वर्ग चर का उपयोग कर सकता है। हाँ, यह बहुत अच्छा है! यह भी देखें @ जवाब, जहां से आप $this(नीट) पास कर सकते हैं ।
बेन

5
यदि आप फ़ंक्शन को स्थिर बनाते हैं (जो आपको चाहिए), तो आप बस लिख usort($array, 'ClassName:merchantSort')सकते हैं, क्या आप नहीं कर सकते?
caw

8
यार ऐसा करने के लिए ऐसा अजीब तरीका लगता है। ओह PHP, हम आपको कैसे प्यार करते हैं।
दुवेवाद

12
@MarcoW।, मुझे लगता है कि क्लासनेम और मर्चेंटसॉर्ट के बीच एक दूसरा गायब है ':'। इसके अलावा, यदि फ़ंक्शन का उपयोग उसी कक्षा के अंदर किया जा रहा है, तो मैंने इसे परीक्षण किया है 'self::merchantSort'और यह काम कर रहा है।
पेरे


21

आपको पास करने की आवश्यकता है $thisजैसे:usort( $myArray, array( $this, 'mySort' ) );

पूर्ण उदाहरण:

class SimpleClass
{                       
    function getArray( $a ) {       
        usort( $a, array( $this, 'nameSort' ) ); // pass $this for scope
        return $a;
    }                 

    private function nameSort( $a, $b )
    {
        return strcmp( $a, $b );
    }              

}

$a = ['c','a','b']; 
$sc = new SimpleClass();
print_r( $sc->getArray( $a ) );

दूसरा खंड अब बेहतर है। लेकिन आप अभी भी अपने पहले उदाहरण में ")" गायब हैं।
कोडस्क्ब्बल

5

इस उदाहरण में मैं सरणी के अंदर एक क्षेत्र द्वारा छाँट रहा हूँ जिसे एवरवोट कहा जाता है।

आप कॉल के अंदर की विधि को शामिल कर सकते हैं, जिसका अर्थ है कि अब आपके पास वर्ग गुंजाइश की समस्या नहीं है, जैसे ...

        usort($firstArray, function ($a, $b) {
           if ($a['AverageVote'] == $b['AverageVote']) {
               return 0;
           }

           return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
        });

1
यह तभी समझ में आता है जब आप इस फ़ंक्शन का उपयोग केवल इस एक प्रकार में कर रहे हों। कई मामलों में एक ही तुलना का उपयोग कई स्थानों पर किया जाता है।
रेशम

1
मुझे जो करना था, उसके लिए यह एकदम सही था। धन्यवाद!
क्रिस्टोफर स्मित

3

लारवेल (5.6) मॉडल वर्ग में, मैंने इसे इस तरह से बुलाया, दोनों विधियां सार्वजनिक स्थिर हैं, विंडोज़ 64 बिट पर php 7.2 का उपयोग करते हुए।

public static function usortCalledFrom() 

public static function myFunction()

मैंने usortCalledFrom () में इस तरह से कॉल किया

usort($array,"static::myFunction")

इनमें से कोई भी काम नहीं था

usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")

static::वर्ग नाम के बजाय मुझे जो चाहिए, उसका उल्लेख करने के लिए धन्यवाद।
ईमानदारी से
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.