标签: usort

PHP中有简单的用户吗?

在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不支持这种非常流行和方便的排序方式?

php arrays sorting usort

5
推荐指数
1
解决办法
193
查看次数

为什么这个 usort() 函数不能正确排序小数?

为什么小数没有正确排序:

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)

php usort

5
推荐指数
1
解决办法
739
查看次数

我们改变了Array的顺序

我有一个单行的usort函数:return 0.
我试图在stdClass对象的数组上使用它,它改变了
它们的顺序,这怎么可能?

php usort

4
推荐指数
1
解决办法
1735
查看次数

PHP usort()期望参数2是有效的回调,而不是在类中

我有一个问题,我不喜欢第二个参数(排序功能).我在课堂上看到很多关于这个问题的问题,答案就是传递一个数组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网站的示例代码.

php warnings usort

4
推荐指数
1
解决办法
5992
查看次数

usort() 排序算法如何工作?

我有一个 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 quicksort usort

4
推荐指数
1
解决办法
1573
查看次数

PHP8.0.0 中发生了什么来破坏 usort(...(int)(strlen($a)&lt;strlen($b)));?

编码

<?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 中发生了什么来破坏这段代码呢?

php usort php-8

4
推荐指数
3
解决办法
1296
查看次数

使用多个条件在php中对关联数组进行排序

考虑以下数组

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

请给我任何建议.

php arrays associative-array usort multidimensional-array

3
推荐指数
1
解决办法
2498
查看次数

在PHP中对多维数组进行排序

我的数组看起来像这样:

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]中的相应索引随之改变.

php usort multidimensional-array

3
推荐指数
1
解决办法
148
查看次数

在symfony2控制器中使用带有关联数组的usort

如何使用usortsymfony2控制器内的关联数组进行排序?

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

php sorting usort symfony

3
推荐指数
2
解决办法
3590
查看次数

使用 usort 和 spaceship 运算符正确排序多维数组

我需要使用以下逻辑对以下数组进行排序:如果“分数”相同,我想使用“时间”进行比较。数组如下:

$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 : …

php sorting usort multidimensional-array asort

3
推荐指数
1
解决办法
4102
查看次数