在PHP中使用usort与类私有函数

139

使用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()函数内调用对象方法
7个回答

259

将你的排序函数变成静态函数:

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

并且在第二个参数中使用一个数组:

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

2
太好了!我还想指出,排序函数不必被隐式地声明为静态方法;因为它仍然可以正常工作 :) - Jimbo
@Jimbo - 这很有道理,所以私有函数可以使用实例化和类变量。是的,这很棒!还可以看看@deceze的答案,您可以传递$this(很酷)。 - Ben
5
如果将该函数声明为静态函数(建议这样做),那么您只需编写usort($array, 'ClassName:merchantSort')即可,对吗? - caw
16
@MarcoW.,我认为在ClassName和merchantSort之间缺少一个冒号。另外,如果该函数在同一类中被使用,我已经测试了'self::merchantSort'并且能够正常工作。 - Pere

89

40

你需要传递 $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
在这个例子中,我正在按照名为AverageVote的数组字段进行排序。
您可以将方法包含在调用内部,这意味着您不再具有类作用域问题,像这样...
        usort($firstArray, function ($a, $b) {
           if ($a['AverageVote'] == $b['AverageVote']) {
               return 0;
           }

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

1
只有在这个排序中使用这个函数时才有意义。在许多情况下,相同的比较会在许多地方使用。 - silk
1
这正是我需要做的,非常完美。谢谢! - Christopher Smit

5
在 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:: 而不是类名是我所需要的,感谢您提到它。 - Sincere

0

最简单的方法是创建一个箭头函数,像这样调用您的排序函数:

uasort($array, fn($a, $b) => $this->mySortFunction($a, $b, $optionalAdditionalParam))

...

private function mySortFunction($a, $b) {
    return -1; // replace with sort logic
}

如果您正在扩展所提出的问题,这似乎是明智的。然而,提问者没有提及关于将额外参数传递给排序方法的任何内容。 - mickmackusa

0

这对我有用,希望能帮到别人:

usort($array, [ClassName::class, "functionName"]);

将“ClassName”替换为您的PHP类的名称,“functionName”替换为您的私有静态函数的名称。

如果所有内容都在自己的类中发生,则此方法也适用:

usort($array, [self::class, "functionName"]);

请将“functionName”替换为您的私有静态函数的名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接