ক্লাস প্রাইভেট ফাংশন সহ পিএইচপিতে usort ব্যবহার করা


119

ঠিক আছে একটি ফাংশন সঙ্গে usort ব্যবহার এত জটিল নয়

আমার লিনিয়ার কোডটিতে এটি আমার আগে ছিল

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

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

বাছাই আমি সহজভাবে

usort($array,"merchantSort");

এখন আমরা কোডটি আপগ্রেড করছি এবং সমস্ত গ্লোবাল ফাংশন সরিয়ে তাদের যথাযথ স্থানে রাখছি। এখন সমস্ত কোড একটি ক্লাসে আছে এবং আমি কীভাবে একটি সহজ ফাংশনের পরিবর্তে পরামিতিটির সাথে পরামিতিটি অ্যারেটি সাজানোর জন্য ইউর্ট ফাংশনটি ব্যবহার করতে পারি তা বুঝতে পারি না can't

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(নীটো) see
বেন

5
আপনি যদি ফাংশনটি স্থির করেন (যা আপনার উচিত), আপনি কেবল লিখতে usort($array, 'ClassName:merchantSort')পারেন, তাই না?
কাও

8
ম্যান এই এটি করার মত একটি অদ্ভুত উপায় মত মনে হচ্ছে। ওহ পিএইচপি, আমরা আপনাকে কীভাবে ভালবাসি।
দোয়াদওয়াদ

12
@ মার্কো। এছাড়াও, যদি ফাংশনটি একই শ্রেণীর ভিতরে ব্যবহার করা হয় তবে আমি এটি পরীক্ষা করেছি '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

লারাভেল (৫..6) মডেল ক্লাসে, আমি এটিকে এটি বলেছিলাম, উভয় পদ্ধতিই পাবলিক স্ট্যাটিক, উইন্ডোজ bit৪ বিটে পিএইচপি 7.২ ব্যবহার করে।

public static function usortCalledFrom() 

public static function myFunction()

আমি এইভাবে usortCalledFrom () এ কল করেছি

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

এগুলির কোনওটিই কাজ ছিল না

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

static::ক্লাস নামের পরিবর্তে আমার যা প্রয়োজন তা উল্লেখ করার জন্য ধন্যবাদ।
আন্তরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.