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

46
我有一个如下所示的数组:
Array
(
    [0] => Array
        (
            'name' => "Friday"
            'weight' => 6
        )
    [1] => Array
        (
            'name' => "Monday"
            'weight' => 2
        )
)
我想获取该数组中最后一个值(即“权重”),并使用它来对主数组元素进行排序。因此,在这个数组中,我希望将“星期一”元素排在“星期五”元素之前。

是的,看起来是这样。我之前就看过这个问题,但直到阅读了这个帖子的回复后才真正理解...唉,好吧 :( - geerlingguy
7个回答

47

你可以使用usort函数,如下所示:

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

usort($arr,"cmp");

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

9

您也可以使用匿名函数。

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

9
可以使用匿名函数来完成。
此外,如果您的“weight”是字符串,请使用其他返回之一(请参见注释掉的行):
<?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,
    ),
)
*/

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
        )

)

2

如果您需要按字符串字段进行排序,例如titlename,则需要使用array_multisort自然排序的标志以及不区分大小写标志:

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

0

注意,如果您要排序的元素是类似于.0534和.0353(例如百分比)的浮点数,则必须将两者乘以1000。不确定为什么...它似乎usort似乎比较整数值。

我花了一段时间才弄清楚这个...

还有两个可能不太明显的提示:

  1. 如果您的数组是对象,则可以使用return $a->weight - $b->weight
  2. 如果您返回$ b->weight - $ a->weight,则会按降序排序。

-1

这里有一个很酷的函数可能会有所帮助:

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,并将'asort'或'sort'用于$sort变量


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接