如何按值排序多维数组?

时间:2010-04-23 13:54:27

标签: php arrays sorting multidimensional-array

如何按“order”键的值对此数组进行排序?尽管这些值当前是连续的,但它们并不总是如此。

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Ready
            [order] => 1
        )
)

14 个答案:

答案 0 :(得分:1534)

尝试usort,如果您仍然使用PHP 5.2或更早版本,则必须首先定义排序功能:

function sortByOrder($a, $b) {
    return $a['order'] - $b['order'];
}

usort($myArray, 'sortByOrder');

从PHP 5.3开始,您可以使用匿名函数:

usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

最后使用PHP 7,您可以使用spaceship operator

usort($myArray, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

要将其扩展为多维排序,如果第一个为零,则引用第二个/第三个排序元素 - 下面最佳说明。您也可以使用它来对子元素进行排序。

usort($myArray, function($a, $b) {
    $retval = $a['order'] <=> $b['order'];
    if ($retval == 0) {
        $retval = $a['suborder'] <=> $b['suborder'];
        if ($retval == 0) {
            $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
        }
    }
    return $retval;
});

如果您需要保留关键关联,请使用uasort() - 请参阅手册中的comparison of array sorting functions

答案 1 :(得分:274)

function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($your_array,"order");

答案 2 :(得分:257)

我使用这个功能:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key=> $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}


array_sort_by_column($array, 'order');

答案 3 :(得分:66)

我通常使用usort,并传递我自己的比较功能。在这种情况下,它非常简单:

function compareOrder($a, $b)
{
  return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');

答案 4 :(得分:16)

实现这一目标的一种方法就是这样

    $new = [
              [
                'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
                'title' => 'Flower',
                'order' => 3,
              ],

              [
                'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
                'title' => 'Free',
                'order' => 2,
              ],

              [
                'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
                'title' => 'Ready',
                'order' => 1,
              ],
    ];

    $keys = array_column($new, 'order');

    $result = array_multisort($keys, SORT_ASC, $new);

结果:

    Array
    (
        [0] => Array
            (
                [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
                [title] => Ready
                [order] => 1
            )

        [1] => Array
            (
                [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
                [title] => Free
                [order] => 2
            )

        [2] => Array
            (
                [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
                [title] => Flower
                [order] => 3
            )

    )

答案 5 :(得分:14)

$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);

这会处理大写和小写字母。

答案 6 :(得分:9)

按照&#34;标题&#34;的值对数组进行排序关键用途:

uasort($myArray, function($a, $b) {
    return strcmp($a['title'], $b['title']);
});

strcmp 比较字符串。

uasort()维护定义的数组键。

答案 7 :(得分:2)

最灵活的方法是使用此方法

Arr::sortByKeys(array $array, $keys, bool $assoc = true): array

原因如下:

  • 您可以按任意键(也像'key1.key2.key3'['k1', 'k2', 'k3']一样嵌套)

  • 在关联数组和非关联数组($assoc标志)上均可工作

  • 它不使用引用-返回新的排序数组

在您的情况下,它很简单:

$sortedArray = Arr::sortByKeys($array, 'order');

此方法是this library的一部分。

答案 8 :(得分:2)

如果任何人需要根据密钥进行最佳排序,请在下面使用

usort($array, build_sorter('order'));

function build_sorter($key) {
   return function ($a, $b) use ($key) {
      return strnatcmp($a[$key], $b[$key]);
   };
}

答案 9 :(得分:1)

此解决方案适用于 usort(),具有易于记忆的多维排序符号。使用宇宙飞船运算符 <=>,可从 PHP 7 获得。

usort($in,function($a,$b){
  return $a['first']   <=> $b['first']  //first asc
      ?: $a['second']  <=> $b['second'] //second asc
      ?: $b['third']   <=> $a['third']  //third desc (a b swapped!)
      //etc
  ;
});

示例:

$in = [
  ['firstname' => 'Anton', 'surname' => 'Gruber', 'birthdate' => '03.08.1967', 'rank' => 3],
  ['firstname' => 'Anna', 'surname' => 'Egger', 'birthdate' => '04.01.1960', 'rank' => 1],
  ['firstname' => 'Paul', 'surname' => 'Mueller', 'birthdate' => '15.10.1971', 'rank' => 2],
  ['firstname' => 'Marie', 'surname' => 'Schmidt ', 'birthdate' => '24.12.1963', 'rank' => 2],
  ['firstname' => 'Emma', 'surname' => 'Mueller', 'birthdate' => '23.11.1969', 'rank' => 2],
];

第一个任务:按职级升序,姓氏升序

usort($in,function($a,$b){
  return $a['rank']      <=> $b['rank']     //first asc
      ?: $a['surname']   <=> $b['surname']  //second asc
  ;
});

第二个任务:按等级降序、姓氏升序、姓氏升序

usort($in,function($a,$b){
  return $b['rank']      <=> $a['rank']       //first desc
      ?: $a['surname']   <=> $b['surname']    //second asc
      ?: $a['firstname'] <=> $b['firstname']  //third asc
  ;
});

第三个任务:Order By rank desc,生日升序

不能以这种表示法对日期进行排序。用 strtotime 转换。

usort($in,function($a,$b){
  return $b['rank']      <=> $a['rank']       //first desc
      ?: strtotime($a['birthdate']) <=> strtotime($b['birthdate'])    //second asc
  ;
});

答案 10 :(得分:1)

去做吧,适用于7.4及以上版本

uasort($yourArray,fn($prev,$now)=>$prev['order']<=>$now['order']);

印刷精美

echo '<pre>';
print_r($yourArray);

答案 11 :(得分:0)

让我们面对现实:php没有一个简单的开箱即用功能来正确处理每个阵列排序场景。

此例程非常直观,这意味着更快的调试和维护:

  <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-jdbc</artifactId>
    <version>2.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-hazelcast</artifactId>
    <version>2.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-mongodb</artifactId>
    <version>2.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-core</artifactId>
    <version>2.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>2.0.2.RELEASE</version>
  </dependency>

答案 12 :(得分:0)

使用array_multisort(),array_map()

array_multisort(array_map(function($element) {
      return $element['order'];
  }, $array), SORT_ASC, $array);

print_r($array);

DEMO

答案 13 :(得分:0)

您可以使用 usort 和带有回调函数的用户定义的排序函数:

usort($new, fn($a, $b) => $a['order'] - $b['order']);

技巧:您可以使用 a > ba - ba <=> b升序排序。对于降序订单,只需ab的互换位置。