Sử dụng usort trong php với hàm private class


119

ok sử dụng usort với một hàm không quá phức tạp

Đây là những gì tôi đã có trước đây trong mã tuyến tính của mình

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

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

để sắp xếp tôi chỉ đơn giản làm

usort($array,"merchantSort");

Bây giờ chúng tôi đang nâng cấp mã và loại bỏ tất cả các chức năng toàn cầu và đặt chúng vào vị trí thích hợp của chúng. Bây giờ tất cả mã đều nằm trong một lớp và tôi không thể tìm ra cách sử dụng hàm usort để sắp xếp mảng với tham số là một phương thức đối tượng thay vì một hàm đơn giản

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
   ...

   }
}

Câu hỏi là làm cách nào để gọi một phương thức đối tượng bên trong hàm usort ()

Câu trả lời:


228

Làm cho chức năng sắp xếp của bạn tĩnh:

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

Và sử dụng một mảng cho tham số thứ hai:

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

2
Điều đó thật tuyệt! Tôi cũng muốn chỉ ra rằng hàm sắp xếp không nhất thiết phải được khai báo ngầm như một phương thức tĩnh; vì nó vẫn hoạt động mà không có :)
Jimbo

@Jimbo - điều đó có ý nghĩa, vì vậy hàm private có thể sử dụng các biến lớp và khởi tạo. Vâng, điều này thật tuyệt! Cũng xem câu trả lời @deceze, nơi bạn có thể vượt qua $this(neato).
Ben

5
Nếu bạn làm cho hàm tĩnh (mà bạn nên làm), bạn chỉ có thể viết usort($array, 'ClassName:merchantSort'), phải không?
caw 23/09/13

8
Người đàn ông này có vẻ như một cách kỳ lạ để làm điều này. Ôi PHP, chúng tôi yêu bạn như thế nào.
dudewad

12
@MarcoW., Tôi nghĩ rằng còn thiếu ':' thứ hai giữa ClassName và merchantSort. Ngoài ra, nếu hàm đang được sử dụng bên trong chính lớp đó, tôi đã thử nghiệm nó 'self::merchantSort'và nó đang hoạt động.
Pere


21

Bạn cần vượt qua $thisví dụ:usort( $myArray, array( $this, 'mySort' ) );

Ví dụ đầy đủ:

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 ) );

Phần thứ hai bây giờ tốt hơn nhiều. Nhưng bạn vẫn còn thiếu ")" trong ví dụ đầu tiên của mình.
Codecribeblr

5

Trong ví dụ này, tôi sắp xếp theo một trường bên trong mảng có tên là AverageVote.

Bạn có thể bao gồm phương thức bên trong cuộc gọi, có nghĩa là bạn không còn gặp vấn đề về phạm vi lớp nữa, như thế này ...

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

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

1
Điều đó chỉ có ý nghĩa nếu bạn chỉ sử dụng chức năng này trong một loại này. Trong nhiều trường hợp, phép so sánh giống nhau được sử dụng ở nhiều nơi.
silk

1
Điều này là hoàn hảo cho những gì tôi cần làm. Cảm ơn!
Christopher Smit

3

Trong lớp mô hình Laravel (5.6), tôi đã gọi nó như thế này, cả hai phương thức đều là public static, sử dụng php 7.2 trên windows 64 bit.

public static function usortCalledFrom() 

public static function myFunction()

Tôi đã gọi trong usortCalledFrom () như thế này

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

Không ai trong số này là công việc

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

static::thay vì tên lớp là những gì tôi cần, cảm ơn vì đã đề cập đến nó.
Chân thành
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.