在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()函数内调用对象方法

Answers:


228

使您的排序功能静态:

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

并将数组用作第二个参数:

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

2
这很棒!我还想指出,sort函数不必隐式声明为静态方法。因为它仍然可以在没有:)的情况下使用
Jimbo

@Jimbo-这很有意义,因此私有函数可以使用实例化和类变量。是的,太好了!另请参阅@deceze答案,您可以在此处通过$this(neato)。

5
如果将函数设为静态(应该是静态的),则可以编写usort($array, 'ClassName:merchantSort'),不是吗?
caw

8
男人,这似乎是一种奇怪的方式。哦,PHP,我们如何爱您。
dudewad

12
@MarcoW。,我认为ClassName和商人排序之间缺少第二个“:”。另外,如果函数是在同一个类内部使用的,我已经对其进行了测试,'self::merchantSort'并且可以正常工作。
2014年


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

现在第二部分要好得多。但是,您在第一个示例中仍然缺少“)”。
codecribblr 2014年

4

在此示例中,我将按数组内称为“平均投票”的字段进行排序。

您可以在调用中包含该方法,这意味着您不再遇到类范围问题,例如...

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

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

1
仅当您仅以这种方式使用此功能时,这才有意义。在许多情况下,许多地方都使用相同的比较。

3

在Laravel(5.6)模型类中,我这样称呼它,这两种方法都是公共静态的,在Windows 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::我需要的是类名,而不是类名,感谢您提到它。
真诚的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.