在 php 中使用带类私有函数的 usort

对函数使用 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 ()函数中调用 object 方法

87215 次浏览

将您的 sort 函数设置为静态:

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

第二个参数使用数组:

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
  1. 打开手册页 http://www.php.net/usort
  2. 看看 $value_compare_func的类型是 callable
  3. 点击链接关键字到达 http://php.net/manual/en/language.types.callable.php
  4. 查看语法是 array($this, 'merchantSort')

在这个例子中,我按照数组中名为 AverageVote 的字段进行排序。

您可以在调用中包含该方法,这意味着您不再存在类范围问题,如下所示..。

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


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

你需要通过 $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 ) );

在 Laravel (5.6)模型类中,我这样称呼它,两个方法都是公共静态的,在 Windows 64位上使用了 php 7.2。

public static function usortCalledFrom()


public static function myFunction()

我确实是这样叫我们来的

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

这些都不是工作

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

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

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

...

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

这对我有用,我希望它能帮助到某些人:

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

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

如果所有的事情都发生在自己的类中,那么这个方法同样有效:

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

用私有静态函数的名称替换“ FunctionName”。