如何按嵌套在其中的元素对 PHP 数组进行排序?

Posted

技术标签:

【中文标题】如何按嵌套在其中的元素对 PHP 数组进行排序?【英文标题】:How do I sort a PHP array by an element nested inside? [duplicate] 【发布时间】:2011-04-11 17:44:28 【问题描述】:

我有一个如下数组:

大批 ( [0] => 数组 ( '名字' => "星期五" '重量' => 6 ) [1] => 数组 ( '名字' => "星期一" '重量' => 2 ) )

我想获取该数组中的最后一个值(“权重”),并使用它对主要数组元素进行排序。所以,在这个数组中,我想对它进行排序,使 'Monday' 元素出现在 'Friday' 元素之前。

【问题讨论】:

most effecient way to order an array by sub elements? 的可能重复项 是的,看起来就是这样。我在此之前看过这个问题,但直到阅读了对该主题的回复后才完全理解它......嗯:( Reference: all basic ways to sort arrays and data in php的可能重复 【参考方案1】:

您可以将usort 用作:

function cmp($a, $b) 
   return $a['weight'] - $b['weight'];


usort($arr,"cmp");

【讨论】:

你可以简单地使用return $a['weight'] - $b['weight']; 这对我来说并不完美,但这似乎是完全正确的解决方案:【参考方案2】:

试试这个: http://php.net/manual/en/function.usort.php

【讨论】:

【参考方案3】:

同意usort,我有时也用array_multisort(http://ca2.php.net/manual/en/function.usort.php)例子3,对数据库结果进行排序。 你可以这样做:

<?php
$days = array(
  array('name' => 'Friday', 'weight' => 6),
  array('name' => 'Monday', 'weight' => 2),
);

$weight = array();
foreach($days as $k => $d) 
  $weight[$k] = $d['weight'];


print_r($days);

array_multisort($weight, SORT_ASC, $days);

print_r($days);
?>

输出:

Array
(
    [0] => Array
        (
            [name] => Friday
            [weight] => 6
        )

    [1] => Array
        (
            [name] => Monday
            [weight] => 2
        )

)
Array
(
    [0] => Array
        (
            [name] => Monday
            [weight] => 2
        )

    [1] => Array
        (
            [name] => Friday
            [weight] => 6
        )

)

【讨论】:

【参考方案4】:

这是一个很酷的功能,可能会有所帮助:

function subval_sort($a,$subkey,$sort) 
    foreach($a as $k=>$v) 
        $b[$k] = strtolower($v[$subkey]);
    
    if($b)
    
        $sort($b);
        foreach($b as $key=>$val) 
            $c[] = $a[$key];
        
        return $c;
    

$a 的形式发送数组,将$subkey 的键和$sort 变量的'asort' 或'sort' 一起发送

【讨论】:

【参考方案5】:

可以使用匿名函数来完成。

此外,如果您的“体重”是 字符串,请使用其他返回值之一(请参阅注释掉的行):

<?php

$arr = array(
    0 => array (
        'name'   => 'Friday',
        'weight' => 6,
    ),
    1 => array (
        'name'   => 'Monday',
        'weight' => 2,
    ),
);

// sort by 'weight'
usort($arr, function($a, $b)  // anonymous function
    // compare numbers only
    return $a['weight'] - $b['weight'];

    // compare numbers or strings
    //return strcmp($a['weight'], $b['weight']);

    // compare numbers or strings non-case-sensitive
    //return strcmp(strtoupper($a['weight']), strtoupper($b['weight']));
);

var_export($arr);

/*
array (
    0 => array (
        'name'   => 'Monday',
        'weight' => 2,
    ),
    1 => array (
        'name'   => 'Friday',
        'weight' => 6,
    ),
)
*/

【讨论】:

【参考方案6】:

您也可以使用匿名函数。

usort($items, function($a, $b) 
    return $a['name'] > $b['name'];
);

【讨论】:

【参考方案7】:

如果您排序的文件是 title name、array_multisort + Natural Sorting 的标志和 CaseInSensitivity 之类的字符串:

$sort_by_title = array();
foreach($items as $item) 
  $sort_by_title [] = $item['title'];

array_multisort($sort_by_title , SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items );

【讨论】:

【参考方案8】:

注意,如果您要排序的元素是 .0534 和 .0353 之类的浮点数(例如百分比),那么您必须将两者都乘以 1000。坦率地说,不知道为什么……看来 usort 似乎比较整数值。

我花了一些时间才弄明白...

还有 2 个可能不会立即明显的提示:

    如果你的数组是对象,你可以使用 return $a->weight - $b->weight 当然 如果返回 $b->weight - $a->weight,它会降序排序。

【讨论】:

以上是关于如何按嵌套在其中的元素对 PHP 数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何按数组计数对嵌套 NSArray 的 NSArray 进行排序?

PHP按包含日期的元素对多维数组进行排序

如何利用php数组对百万数据进行排重

JAVA中的数组合并问题

php 数组排序以及按照某个字段排序

使用 Mongoose.js 按嵌套数组中的字段排序