8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

按一个属性对对象数组进行排序

murali k 2月前

184 0

我如何根据对象数组的某个字段(如名称或计数)对其进行排序?Array( [0] => stdClass Object ( [ID] => 1 [name] => Mary Jane [

我如何根据对象的某个字段(如 name 或 ) count

Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [name] => Mary Jane
            [count] => 420
        )

    [1] => stdClass Object
        (
            [ID] => 2
            [name] => Johnny
            [count] => 234
        )

    [2] => stdClass Object
        (
            [ID] => 3
            [name] => Kathy
            [count] => 4354
        )

   ....
帖子版权声明 1、本帖标题:按一个属性对对象数组进行排序
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由murali k在本站《object》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 使用 usort 自定义比较函数。以下是改编自手册的示例:

    function cmp($a, $b) {
        return strcmp($a->name, $b->name);
    }
    
    usort($your_data, "cmp");
    

    您还可以使用任何 callable 作为第二个参数。以下是一些示例:

    • p2

        usort($your_data, function($a, $b) {return strcmp($a->name, $b->name);});
    • p3

        usort($your_data, array($this, "cmp")); // "cmp" should be a method in the class
    • p4

        usort($your_data, fn($a, $b) => strcmp($a->name, $b->name));

    此外,如果您正在比较数值, fn($a, $b) => $a->count - $b->count 那么 \'compare\' 函数应该可以解决问题,或者,如果您想要另一种方式来做同样的事情,那么从 PHP 7 开始,您可以使用 Spaceship 运算符 ,如下所示: fn($a, $b) => $a->count <=> $b->count .

  • 这很好,但如果排序函数与调用函数在同一个类中,则应该使用:usort($your_data, array($this, \'cmp\'));

  • 或者,如果您的比较函数位于您正在比较的模型/对象中(我认为这是一种更清晰的设计),则必须将完整的命名空间包含到您的模型/对象中,如下所示:uasort($members, array(\'Path\to\your\Model\Member\', \'compareByName\'));

  • 这是一个使用闭包的更好的方法

    usort($your_data, function($a, $b)
    {
        return strcmp($a->name, $b->name);
    });
    

    请注意,这不在 PHP 的文档中,但如果您使用 5.3+ 闭包,则可以提供可调用参数。

  • 对于降序排序,-1 * strcmp($a->name, $b->name);

  • 无需乘以降序排序。只需交换参数:strcmp($b->name, $a->name)

  • wxz 2月前 0 只看Ta
    引用 8

    您可能会遇到和我一样的情况,接受的答案比这个更可取。例如,您可能有一个父类和一个子类。子类重写了一个使用 usort 的函数,但比较函数是相同的。使用这种方法,您需要复制闭包的代码,而不是调用受保护的静态方法,而您只需在父类中定义一次即可。

  • 如果要对整数值进行排序:

    // Desc sort
    usort($array,function($first,$second){
        return $first->number < $second->number;
    });
    
    // Asc sort
    usort($array,function($first,$second){
        return $first->number > $second->number;
    });
    

    更新 不要忘记转换为相同的寄存器(上限或下限)

    // Desc sort
    usort($array,function($first,$second){
        return strtolower($first->text) < strtolower($second->text);
    });
    
    // Asc sort
    usort($array,function($first,$second){
        return strtolower($first->text) > strtolower($second->text);
    });
    
  • 对我来说,$first->number 不起作用。我需要改用 $first[\'number\']。

  • 除了使用 strtolower() 之外,您还可以使用 PHP 原生的 strcasecmp() 函数来比较字符串并忽略大小写(阅读 PHP:strcasecmp - 手册)

  • 引用 12

    如果你使用 php oop 你可能需要更改为:

    public static function cmp($a, $b) 
    {
        return strcmp($a->name, $b->name);
    }
    
    //in this case FUNCTION_NAME would be cmp
    usort($your_data, array('YOUR_CLASS_NAME','FUNCTION_NAME')); 
    
  • oezi 2月前 0 只看Ta
    引用 13
    usort($array, 'my_sort_function');
    
    var_dump($array);
    
    function my_sort_function($a, $b)
    {
        return $a->name < $b->name;
    }
    

    相同的代码将与该 count 字段相同。

    更多详细信息请访问 usort https://www.php.net/usort

    顺便问一下,您从哪里获取该数组的?我希望不是从数据库中获取的?

  • 引用 14

    实际上,如果成功,$result 将包含 TRUE,并且比较应该是 $a->name > $b->name。:)

  • @cambraca:哦,忘了它接受引用数组。顺便说一句,原帖者没有说他需要按什么顺序对集合进行排序。

  • 它更复杂,因为这是 wordpress 的标准函数部分,而且当我编写插件时,我无法更改 wp 文件。我尝试使用 create_function 的示例(因为我在类中使用它,我不知道如何将函数名称传递给 usort):create_function('$a,$b', \'return $a->count < $b->count;\') 但我无法让它工作 :( 我收到一些通知和警告,usort 期望参数 2 是有效的回调

  • 要对一列值进行排序, array_column() array_multisort() 是一种明智的方法。 演示

    array_multisort(array_column($array, 'count'), $array);
    

    或者只调用 usort() 宇宙飞船操作符来减少这种场景的迭代次数。 演示

    usort($array, fn($a, $b) => $a->count <=> $b->count);
    

    请注意,尽管计数值在输入数组中被转换为字符串类型值,但两个排序函数都会正确地按数字顺序对值进行排序,而不是按字母顺序排序(错误地放在 23420 之前 420 )。这是一个可靠的默认功能。

    即使您以变量的方式声明要排序的列,这两种方法都允许使用该变量,而无需任何其他技术。

    带变量的多排序演示

    $property = 'count';
    array_multisort(array_column($array, $property), $array);
    

    带变量的 Usort 演示

    $property = 'count';
    usort($array, fn($a, $b) => $a->$property <=> $b->$property);
    

    两个本机排序函数都通过引用进行修改,因此不要尝试通过它们的返回值访问已排序的数组。

    array_multisort() 的默认排序方向是升序,因此在两个数组参数之间明确使用 没有任何好处 SORT_ASC 。如果需要降序排序,请 SORT_DESC 在两个数组之间写入(作为第二个参数)。

    usort() 当自定义函数体将 $a 数据放在宇宙飞船运算符的左侧并将 $b 数据放在右侧时,将按升序排序。 若要按降序排序,只需将 $b 数据写在左侧并将 $a 数据写在右侧即可。

    两种方法都能够接收多个排序规则,但由于这个问题只要求对单个列进行排序,因此该指导在这里并不合适。

    都调用一个函数(如 )效率会降低 strcmp() 。这不再是最佳实践。使用双向比较(如 > < )来返回布尔结果也不行。三向比较应该从 usort() .

    对于使用多个规则/列/属性对数据进行排序, 这个答案 提供了很好的指导。

  • gbn 2月前 0 只看Ta
    引用 18

    如果一切都失败了,这里还有另一个解决方案:

    $names = array(); 
    foreach ($my_array as $my_object) {
        $names[] = $my_object->name; //any object field
    }
    
    array_multisort($names, SORT_ASC, $my_array);
    
    return $my_array;
    
  • 您可以使用此函数(适用于 PHP 版本 >= 5.3):

    function sortArrayByKey(&$array,$key,$string = false,$asc = true){
        if($string){
            usort($array,function ($a, $b) use(&$key,&$asc)
            {
                if($asc)    return strcmp(strtolower($a{$key}), strtolower($b{$key}));
                else        return strcmp(strtolower($b{$key}), strtolower($a{$key}));
            });
        }else{
            usort($array,function ($a, $b) use(&$key,&$asc)
            {
                if($a[$key] == $b{$key}){return 0;}
                if($asc) return ($a{$key} < $b{$key}) ? -1 : 1;
                else     return ($a{$key} > $b{$key}) ? -1 : 1;
    
            });
        }
    }
    

    例子:

    sortArrayByKey($yourArray,"name",true); //String sort (ascending order)
    sortArrayByKey($yourArray,"name",true,false); //String sort (descending order)
    sortArrayByKey($yourArray,"id"); //number sort (ascending order)
    sortArrayByKey($yourArray,"count",false,false); //number sort (descending order)
    
  • 我使用 $a->{$key} 和 $b->{$key} 而不是 $a[$key] 和 $b[$key],严格来说,我们处理的是属性而不是数组成员,但这仍然是我想要的答案。

返回
作者最近主题: