如何在PHP中对数组和数据进行排序?

324

此问题旨在提供关于PHP数组排序的问题的参考。您可能认为您的特殊情况是独一无二的,并值得一个新问题,但大多数实际上只是本页解决方案的轻微变体。

如果您的问题被关闭并作为重复问题,请仅在您能够解释它与下面所有问题都有显著不同之处时,请请求重新打开您的问题。

如何在PHP中对数组进行排序?
如何对复杂数组进行排序?
如何对对象数组进行排序?


  1. 基本一维数组;包括多维数组、包括对象数组;包括基于另一个数组的排序

  2. 使用SPL进行排序

  3. 稳定的排序

对于使用PHP现有函数的实用答案,请参见1.;对于排序算法的学术详细答案(PHP的函数实现和您可能需要应对真正复杂的情况),请参见2。

14个回答

-1

有几种方法可以对数组进行排序。我将提及一些完成此任务的方法。首先,我将给出一个称为“$numbers”的整数数组。

$number = array(8,9,3,4,0,1,2);

这是创建数组的常规方式。假设我想按升序对该数组进行排序。可以使用 'sort()' 方法。

<?php

    $number = array(8,9,3,4,0,1,2);
    sort($number);

   foreach ($number as $value) {
       echo $value."  ";
   }
?>

现在考虑一下它的输出结果,

enter image description here

你可以看到打印的数字数组已经排序。如果你想让这个数字数组以降序排列,可以使用 'rsort()' 方法来完成。

<?php

     $number = array(8,9,3,4,0,1,2);
     rsort($number);

     foreach ($number as $value) {
        echo $value."  ";
     }
?>

考虑输出..

enter image description here

现在数组已按降序排序。好的,让我们考虑一个关联数组。我会给出一个关联数组(关联数组是指每个索引都具有唯一键值的数组)如下:

$number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);

现在,我想按照它们的值升序排序这个数组。可以使用'asort()'方法来实现。

<?php

   $number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);
   asort($number);

   foreach ($number as $value) {
      echo $value."  ";
    }
?>

如果按照它们的值降序排序,可以使用“arsort()”方法。假设您想根据键值对数组进行排序。在这种情况下,可以使用“ksort()”方法。
<?php

     $number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);
     ksort($number);

     foreach ($number as $value) {
         echo $value."  ";
     }
?>

现在考虑输出。 输入图像描述

现在,数组根据其键值进行排序。如果您想按键值降序对数组进行排序,则可以使用“krsort()”方法。

<?php

    $number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);
    krsort($number);

    foreach ($number as $value) {
       echo $value."  ";
    }
?>

现在,关联数组按照它们的键值降序排序。请查看输出结果。 enter image description here

这些是在PHP中按升序或降序对数组进行排序的一些方法。希望您能够得到一个想法。谢谢!


Deceze在接受的答案中已经涵盖了这些见解:“它们之间的区别仅在于是否保留键值关联(“a”函数)、它是按低到高还是反向排序(“r”)、它是按值还是按键排序(“k”)以及如何比较值(“nat” vs. normal)。” - mickmackusa

-1

这个答案是关于多列排序的,其中数组应该按照非连续索引的值,在每个一维元素内进行排序。 这与多维排序不同,因为每个元素仅由各种键=>值对组成。

function fncCmp( array $ItmOne, array $ItmTwo ) {       ; # callback for sorting items (which are arrays) by values at specific indexes
  $strCmpOne = $ItmOne[ 'ColOne' ] . $ItmOne[ 'ColThr' ]; # build compound values
  $strCmpTwo = $ItmTwo[ 'ColOne' ] . $ItmTwo[ 'ColThr' ]; #   to compare
  return $strCmpOne <=> $strCmpTwo                      ; # pass back comparison-result
} # fncCmp

$arrDat = array(                                                       # define an array of items
  array( 'ColOne' => 'Val2', 'ColTwo' => 'Val8', 'ColThr' => 'Val6' )  #   each of which
 ,array( 'ColOne' => 'Val2', 'ColTwo' => 'Val9', 'ColThr' => 'Val4' )  #   is an
 ,array( 'ColOne' => 'Val1', 'ColTwo' => 'Val7', 'ColThr' => 'Val5' )  #   array of
)                                                                    ; #   fields
var_dump       ( $arrDat           )                                 ; # emit items before sort
$bolSrt = usort( $arrDat, 'fncCmp' )                                 ; # sort the array by comparing elements
var_dump       ( $arrDat           )                                 ; # emit items after  sort

-1
如果有人想要一个更简单的解决方案来操作数组,只需使用 Laravel Collection 包,它已经实现了 sortBy 函数,让您可以轻松地按键排序。
$collection->sortBy('forename')->sortBy('surname');

即,为了按先a,然后b,最后c排序,正确的子句应该是:
sortBy('c')->sortBy('b')->sortBy('a')

https://packagist.org/packages/tightenco/collect


-2
最简单的方法是使用usort函数对数组进行排序,而无需任何循环: 以下是一个示例:
   $array_compare= array("0" =>4,"1"=>2,"2"=>500,"3"=>100);

这将按降序排序:

usort($array_compare, function($a, $b) {
        return ($b['x1'] - $a['x1']) > 0 ? 1 :-1;
    });

这将按升序排序:

usort($array_compare, function($a, $b) {
        return ($b['x1'] - $a['x1']) < 0 ? 1 :-1;
    });

1
  1. 示例和代码不一致。
  2. 这已经在上面的答案中详细解释了。
  3. 你可能在回答不同的问题吗?
- deceze

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