在PHP中,通过子数组的值对数组进行排序

21

我有一个由多个数组组成的数组。我想按子数组的属性对父数组进行排序。以下是一个示例:

array(2){
    [0]=> array(3){
        [0]=> string(6) "105945"
        [1]=> string(10) "First name"
        [2]=> float(0.080878465391)
    }
    [1]=> array(3) {
        [0]=> string(6) "109145"
        [1]=> string(11) "Second name"
        [2]=> float(0.0504154818384)
    }
}

我想按子数组中的[2]升序排序父数组,因此在这种情况下,结果将使子数组反向排序(.0508)。是否可以使用多种PHP排序函数实现?

5个回答

38

您可以利用usort函数进行排序:

$arr = array(
    array("105945", "First name", 0.080878465391),
    array("109145", "Second name", 0.0504154818384)
);

function cmp($a, $b){
    if($a[2] == $b[2]){
        return 0;
    }
    return ($a[2] < $b[2]) ? -1 : 1;
}

usort($arr, "cmp");

那个页面上的示例#2与您尝试做的非常相似,请看一下。 - Chad Birch
哇,非常有帮助的答案。谢谢你。 - Evan

13

短小精悍的代码。感谢您挽救了我的一天。 - Ajay Gadhavana

5

对于像数据库一样的模式,请使用array_multisort,就像示例#3中所示。

例如:

$sort = array();
foreach ($data as $key => $row) {
  $sort[$key]  = $row['basis'];
}
array_multisort($sort, SORT_ASC, $data);

其中$data是您的数据数组,basis是用于排序的元素。


1

从PHP 7.4开始,您可以使用 usort()太空船操作符箭头函数 缩短代码:

usort($arr, fn($a, $b) => $a[2] <=> $b[2]);
#                      ^         ^
#                      |         spaceship operator
#                      arrow function

例子:

$arr = [
    ['105945', 'First name',  0.080878465391],
    ['109145', 'Second name', 0.0504154818384],
];
usort($arr, fn($a, $b) => $a[2] <=> $b[2]);
var_export($arr);

输出(简化):

array (
  0 => array (0 => '109145', 1 => 'Second name', 2 => 0.0504154818384),
  1 => array (0 => '105945', 1 => 'First name',  2 => 0.080878465391),
)

您可以使用标量类型声明来提高类型提示的效果:
usort($arr, fn(array $a, array $b): int => $a[2] <=> $b[2]);

1
工作演示:https://3v4l.org/kRSep - Syscall

-4
请查看此页面作为示例。
http://php.net/manual/en/function.sort.php

例如。
      <?php 
function multisort($array, $sort_by) {
    foreach ($array as $key => $value) {
        $evalstring = '';
        foreach ($sort_by as $sort_field) {
            $tmp[$sort_field][$key] = $value[$sort_field];
            $evalstring .= '$tmp[\'' . $sort_field . '\'], ';
        }
    }
    $evalstring .= '$array';
    $evalstring = 'array_multisort(' . $evalstring . ');';
    eval($evalstring);

    return $array;
} 

$test = array(
    array( 'a' => '1', 'b' => '3'),
    array( 'a' => '2', 'b' => '1'),
    array( 'a' => '1', 'b' => '1'));

echo 'Unsorted: ';
print_r($test);

$result = multisort( $test , array('a','b') );

echo 'Sorted: ';
print_r($result);
?>

Result:

Unsorted: Array
(
    [0] => Array
        (
            [a] => 1
            [b] => 3
        )

    [1] => Array
        (
            [a] => 2
            [b] => 1
        )

    [2] => Array
        (
            [a] => 1
            [b] => 1
        )

)
Sorted: Array
(
    [0] => Array
        (
            [a] => 1
            [b] => 1
        )

    [1] => Array
        (
            [a] => 1
            [b] => 3
        )

    [2] => Array
        (
            [a] => 2
            [b] => 1
        )

)

2
这是一些非常可怕的代码 - 我强烈建议你不要使用它。请使用推荐的 usort() 函数。 - Chad Birch
嘿,usort()函数已经提供了。因此,我只提供另一种解决方案,即提供手册中的示例。 - Karthik

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