在PHP中,usort函数有两个参数:array to sort和callback.回调也有两个参数:$ a和$ b.然后,我们以任何我们想要的方式比较这两者.它总是让我吃惊,因为这个用例usort是不是太普通了.我们通常使用相同的属性对值进行排序,或者对$ a和$ b使用相同的逻辑.例如,如果我们想按长度排序:
$animals = ['dog', 'tiger', 'giraffe', 'bear'];
usort($animals, function ($a, $b) {
return strlen($a) - strlen($b);
});
Run Code Online (Sandbox Code Playgroud)
这会奏效,但我们需要说strlen两遍.这样说会更好:
usort($animals, function ($element) {
return strlen($element);
});
Run Code Online (Sandbox Code Playgroud)
或者甚至像这样:
usort($animals, 'strlen');
Run Code Online (Sandbox Code Playgroud)
我自己编写了这种函数(使用PHP 7的好东西,但它可以很容易地改为PHP 5):
function simple_usort(array &$array, callable $callback): bool
{
return usort($array, function ($a, $b) use ($callback) {
return $callback($a) <=> $callback($b);
});
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是它不是已经在其他功能中用PHP构建了吗?如果没有,为什么PHP不支持这种非常流行和方便的排序方式?
为什么小数没有正确排序:
13
11
14
10
12.5
---------------------------------------------------------
descending order:
14
12.5
13
11
10
Run Code Online (Sandbox Code Playgroud)
使用此代码:
class Customer {
public $score;
public function __construct($score) {
$this->score = $score;
}
}
$customers = [];
$customers[] = new Customer(13);
$customers[] = new Customer(11);
$customers[] = new Customer(14);
$customers[] = new Customer(10);
$customers[] = new Customer(12.5);
if(is_array($customers) && count($customers) > 0)
{
foreach($customers as $customer)
{
echo '<div>'.$customer->score.'</div>';
}
}
echo '<hr/>';
echo '<div>descending order:</div>';
usort($customers, function($a, $b) {
return $b->score - $a->score;
}); …Run Code Online (Sandbox Code Playgroud) 我有一个单行的usort函数:return 0.
我试图在stdClass对象的数组上使用它,它改变了
它们的顺序,这怎么可能?
我有一个问题,我不喜欢第二个参数(排序功能).我在课堂上看到很多关于这个问题的问题,答案就是传递一个数组array($this, functionName)
但在我的情况下,这是行不通的.该脚本不是一个类,但我收到此错误:
PHP Warning: usort() expects parameter 2 to be a valid callback, function 'cmp' not found or invalid function name in <filename.php>
Run Code Online (Sandbox Code Playgroud)
那么第二个参数,即函数名称的问题是什么?这是直接来自PHP网站的示例代码.
我有一个 usort() 示例,我添加了一些 echo 语句来查看代码的工作原理:
<?php
function list_cmp($a, $b) {
global $order;
echo "\$a=$a, \$b=$b </br>";
foreach ($order as $key => $value) {
echo "\$value=$value </br>";
if ($a == $value) {
echo "\$a=\$value, returing 0. </br>";
return 0;
}
if ($b == $value) {
echo "\$b=\$value, returing 1. </br>";
return 1;
}
}
}
$order[0] = 1;
$order[1] = 3;
$order[2] = 4;
$order[3] = 2;
$array[0] = 2;
$array[1] = 1;
$array[2] = 3;
$array[3] = 4;
$array[4] = …Run Code Online (Sandbox Code Playgroud) 编码
<?php
$consts = get_defined_constants();
$consts = array_keys($consts);
usort($consts,function($a,$b){return (int)(strlen($a)<strlen($b));});
foreach($consts as $const){
echo strlen($const).": ".$const."\n";
}
Run Code Online (Sandbox Code Playgroud)
将在 PHP 8.0.0 之前按照我的预期从最长到最短打印所有定义的常量。7.3.13 开始于
62: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE
62: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE
60: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE
60: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE
51: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX
Run Code Online (Sandbox Code Playgroud)
但我不知道 PHP8.0.0 做了什么,它的输出开始于:
9: E_WARNING
21: FILTER_FLAG_STRIP_LOW
7: E_ERROR
26: FILTER_FLAG_STRIP_BACKTICK
Run Code Online (Sandbox Code Playgroud)
你可以在 3v4l 上看到它:https ://3v4l.org/MP2IF
那么在 PHP 8.0.0 中发生了什么来破坏这段代码呢?
考虑以下数组
$details = array(
array('lname'=>'A', 'fname'=>'P','membkey'=>700,'head'=>'y'),
array('lname'=>'B', 'fname'=>'Q','membkey'=>540,'head'=>'n'),
array('lname'=>'C', 'fname'=>'R','membkey'=>700,'head'=>'n'),
array('lname'=>'D', 'fname'=>'S','membkey'=>540,'head'=>'y'),
array('lname'=>'E', 'fname'=>'T','membkey'=>700,'head'=>'n')
);
Run Code Online (Sandbox Code Playgroud)
在这里,我想用head和membkey排序.同一个membkey元素的顶部元素应该有'head = y'并且回显为,
$details = array(
array('lname'=>'A', 'fname'=>'P','membkey'=>700,'head'=>'y'),
array('lname'=>'E', 'fname'=>'T','membkey'=>700,'head'=>'n'),
array('lname'=>'C', 'fname'=>'R','membkey'=>700,'head'=>'n'),
array('lname'=>'D', 'fname'=>'S','membkey'=>540,'head'=>'y'),
array('lname'=>'B', 'fname'=>'Q','membkey'=>540,'head'=>'n')
);
Run Code Online (Sandbox Code Playgroud)
我尝试了如下
function orderbymemberKey( $a, $b ){
if ( $a[membkey] == $b[membkey] )
return 0;
return($a[membkey] < $b[membkey] )? -1 :1;
}
usort( $details, orderbymemberKey );
and it successfully order by membkey.
Run Code Online (Sandbox Code Playgroud)
请给我任何建议.
我的数组看起来像这样:
Array
(
[0] => Array
(
[0] => 1
[1] => 6
[2] => 4
[3] => 5
)
[1] => Array
(
[0] => 272.05
[1] => 63.54
[2] => 544.79
[3] => 190.62
)
[2] => Array
(
[0] => 2011-03-06 14:08:19
[1] => 2011-03-06 14:29:04
[2] => 2011-03-06 14:28:39
[3] => 2011-03-06 14:29:28
)
)
Run Code Online (Sandbox Code Playgroud)
我想按$ myArray排序[1].我有这个usort功能:
function sortAmount($a, $b) {
return strnatcmp($a[1], $b[1]);
}
Run Code Online (Sandbox Code Playgroud)
它被称为这样:
usort($myArray, "sortAmount");
Run Code Online (Sandbox Code Playgroud)
但是,调用usort后,数组不会更改.我希望$ myArray [1]中的数字按升序排序,并且$ myArray [0]和$ myArray [2]中的相应索引随之改变.
如何使用usort对symfony2控制器内的关联数组进行排序?
//sort
function compare($a, $b)
{
return strnatcmp($a['sort'], $b['sort']);
}
usort($content, 'compare');
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
警告:usort()期望参数2是有效的回调,函数'compare'未找到或函数名称无效
就像把它放在像这样的私有函数中一样
// sort
usort($content, '$this->compare');
return $content;
}
//sort
private function compare($a, $b)
{
return strnatcmp($a['sort'], $b['sort']);
}
Run Code Online (Sandbox Code Playgroud)
这没有变化
// sort
usort($content, 'compare');
return $content;
}
//sort
private function compare($a, $b)
{
return strnatcmp($a['sort'], $b['sort']);
}
Run Code Online (Sandbox Code Playgroud) 我需要使用以下逻辑对以下数组进行排序:如果“分数”相同,我想使用“时间”进行比较。数组如下:
$user_scores = [ 82 => [ 'score' => 1, 'time' => 6.442 ],
34 => [ 'score' => 1, 'time' => 5.646 ],
66 => [ 'score' => 3, 'time' => 1.554 ]
]
Run Code Online (Sandbox Code Playgroud)
上面数组中的“键”是“user_ids”,我需要将其保留在排序数组中。到目前为止我最好的尝试如下 -
$result = usort( $user_scores, function ( $a, $b ) {
if ( $a['score'] == $b['score'] ) {
return $a['time'] == $b['time'];
}
return $a['score'] <=> $b['score'];
} );
Run Code Online (Sandbox Code Playgroud)
显然,这是行不通的,我得到的 $user_scores 数组的所有键都替换为 0、1、2 而不是 user_ids ( 82、34 和 66 )。排序也不起作用。
对于上面的数组,我想要的输出是 $user_scores array : …