Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中对数组和数据进行排序?_Php_Arrays_Sorting_Object_Spl - Fatal编程技术网

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

如何在PHP中对数组和数据进行排序?,php,arrays,sorting,object,spl,Php,Arrays,Sorting,Object,Spl,本问题旨在作为有关PHP中数组排序问题的参考。很容易认为您的特定案例是独特的,值得提出一个新问题,但大多数都是本页解决方案之一的微小变化 如果您的问题作为本问题的副本关闭,请要求重新打开您的问题,前提是您可以解释为什么它与以下所有问题明显不同 如何在PHP中对数组进行排序? 如何在PHP中对复杂数组进行排序? 如何在PHP中对对象数组进行排序 有关使用PHP现有函数的实际答案,请参见1。有关PHP函数实现的排序算法以及非常非常复杂的情况下可能需要的排序算法的详细学术答案,请参见2。Basic一维

本问题旨在作为有关PHP中数组排序问题的参考。很容易认为您的特定案例是独特的,值得提出一个新问题,但大多数都是本页解决方案之一的微小变化

如果您的问题作为本问题的副本关闭,请要求重新打开您的问题,前提是您可以解释为什么它与以下所有问题明显不同

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

有关使用PHP现有函数的实际答案,请参见1。有关PHP函数实现的排序算法以及非常非常复杂的情况下可能需要的排序算法的详细学术答案,请参见2。

Basic一维数组 适用的分拣功能:

function cmp(array $a, array $b) {
    return someFunction($a['baz']) - someFunction($b['baz']);
}
分类 排序 阿索尔 阿尔索特 自然排序 纳卡索特 对数组按照键名排序 克索特 它们之间的区别仅仅在于a函数是否保留键值关联,它是从低到高排序还是反向r,它是对值还是键k排序,以及它是如何将值nat与正常值进行比较的。请参阅,以获取概述和指向更多详细信息的链接

多维数组,包括对象数组 如果要按每个条目的键“foo”对$array排序,则需要一个自定义比较函数。上面的排序和相关函数处理简单的值,它们知道如何比较和排序。PHP不知道如何处理复杂的值,比如数组'foo'=>bar','baz'=>42;所以你需要说出来

为此,您需要创建一个比较函数。该函数接受两个元素,如果认为这些元素相等,则必须返回0;如果第一个值较低,则返回小于0的值;如果第一个值较高,则返回大于0的值。这就是所需要的:

function cmp(array $a, array $b) {
    if ($a['foo'] < $b['foo']) {
        return -1;
    } else if ($a['foo'] > $b['foo']) {
        return 1;
    } else {
        return 0;
    }
}
usort将从数组中获取两个项,并使用它们调用cmp函数。因此,cmp将使用$a作为数组'foo'=>'bar','baz'=>42调用,而$b作为另一个数组'foo'=>,'baz'=>。。。。然后,函数返回usort哪个值更大,或者它们是否相等。usort重复此过程,为$a和$b传递不同的值,直到数组排序。cmp函数将被多次调用,调用次数至少与$array中的值相同,每次调用$a和$b的值组合不同

要习惯这个想法,请尝试以下方法:

function cmp($a, $b) {
    echo 'cmp called with $a:', PHP_EOL;
    var_dump($a);
    echo 'and $b:', PHP_EOL;
    var_dump($b);
}
您所做的只是定义一种自定义方式来比较两个项目,这就是您所需要的。这适用于各种各样的价值观

顺便说一下,这适用于任何值,值不必是复杂的数组。如果您想进行自定义比较,也可以在一个简单的数字数组上进行

排序按引用排序,不返回任何有用的内容! 请注意,数组排序到位,您不需要将返回值分配给任何对象$array=sort$array将用true替换数组,而不是用排序数组。只需排序$array;工作

自定义数字比较 如果要按baz键进行排序(该键为数字),则只需执行以下操作:

function cmp(array $a, array $b) {
    return $a['baz'] - $b['baz'];
}
多亏了数学的力量,这将根据$a是小于、等于还是大于$b返回一个<0、0或>0的值

请注意,这对浮点值不起作用,因为它们将减少为int并失去精度。改为使用显式的-1、0和1返回值

物体 如果有一个对象数组,其工作方式相同:

function cmp($a, $b) {
    return $a->baz - $b->baz;
}
功能 您可以在比较函数中执行任何需要的操作,包括调用函数:

function cmp(array $a, array $b) {
    return someFunction($a['baz']) - someFunction($b['baz']);
}
串 第一个字符串比较版本的快捷方式:

function cmp(array $a, array $b) {
    return strcmp($a['foo'], $b['foo']);
}
strcmp完全按照这里对cmp的期望执行,它返回-1、0或1

宇宙飞船操作员 PHP 7引入了,它统一并简化了不同类型之间的等/小/大比较:

function cmp(array $a, array $b) {
    return $a['foo'] <=> $b['foo'];
}
对于熟悉的人来说,这相当于一个按foo,baz排序的SQL查询。 另请参见和

按手动、静态顺序排序 如果要将元素按foo、bar、baz等手动顺序排序,请执行以下操作:

综上所述,如果您使用的是PHP 5.3或更高版本,并且确实应该使用匿名函数来编写更短的代码,并避免出现另一个全局函数:

usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
这就是对复杂多维数组进行排序的简单程度。再一次,想想教PHP如何分辨两项中哪一项更大;让PHP进行实际排序

同样对于以上所有内容,要在升序和降序之间切换,只需交换$a和$b参数即可。例如:

return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
基于另一个数组对一个数组进行排序 还有一种特殊的方法,可以让你根据一个数组对另一个数组进行排序:

$array1 = array( 4,   6,   1);
$array2 = array('a', 'b', 'c');
这里的预期结果是:

$array2 = array('c', 'a', 'b');  // the sorted order of $array1
使用array_multisort到达目标:

array_multisort($array1, $array2);
从PHP 5.5.0开始,您可以使用array_column从多维数组中提取一列,并对该列上的数组进行排序:

array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
您还可以对多个文件进行排序 每个方向上的列:

array_multisort(array_column($array, 'foo'), SORT_DESC,
                array_column($array, 'bar'), SORT_ASC,
                $array);
从PHP7.0.0开始,您还可以从对象数组中提取属性

如果您有更常见的情况,请随意编辑此答案


大多数的基本方法已经在本文中介绍过了,我会尝试看看其他类型的排序

SPL排序 输出

c
b
a
SplMaxHeap类提供堆的主要功能,将最大值保持在顶部

$heap = new SplMaxHeap();
$heap->insert(1);
$heap->insert(2);
$heap->insert(3);
SplMinHeap类提供堆的主要功能,将最小值保持在顶部

$heap = new SplMaxHeap();
$heap->insert(1);
$heap->insert(2);
$heap->insert(3);
其他种类 气泡排序 从

冒泡排序,有时被错误地称为下沉排序,是一种简单的排序算法,它通过重复单步遍历要排序的列表,比较每对相邻项,如果它们的顺序错误,则交换它们。重复传递列表,直到不需要交换,这表示列表已排序。该算法的名称来源于较小元素在列表顶部冒泡的方式。因为它只使用比较来对元素进行操作,所以它是一种比较排序。虽然算法很简单,但大多数其他排序算法对于大型列表更有效

选择排序 从

在计算机科学中,选择排序是一种排序算法,特别是就地比较排序。它具有2倍的时间复杂度,使得它在大型列表上效率低下,并且通常比类似的插入排序性能差。选择排序以其简单性著称,在某些情况下,特别是在辅助内存有限的情况下,它比更复杂的算法具有性能优势

插入排序 从

插入排序是一种简单的排序算法,它一次构建最终的排序数组或列出一项。与更高级的算法(如快速排序、堆排序或合并排序)相比,它在大型列表上的效率要低得多。但是,插入排序有几个优点:

希尔排序 从

Shellsort,也称为Shell sort或Shell的方法,是一种就地比较排序。它概括了一种交换排序,例如插入排序或冒泡排序,方法是先将元素与相距较远的元素进行比较和交换,然后再与相邻元素进行比较和交换

梳排序 从

梳状排序是一种相对简单的排序算法,最初由Wlodzimierz Dobosiewicz于1980年设计。后来,斯蒂芬·莱西和理查德·博克斯于1991年重新发现了它。梳状排序改进了冒泡排序

合并排序 从

在计算机科学中,合并排序(通常也称为mergesort)是一种基于对数n比较的排序算法。大多数实现产生稳定的排序,这意味着该实现在排序后的输出中保留相等元素的输入顺序

快速分类 从

快速排序,或称分区交换排序,是Tony Hoare开发的一种排序算法,平均而言,它可以对n个日志进行比较,以对n个项目进行排序。在最坏的情况下,它会进行On2比较,尽管这种行为很少见

置换排序 从

排列排序,通过生成输入数组/列表的可能排列,直到发现已排序的排列为止

基数排序 从

在计算机科学中,基数排序是一种非比较整数排序算法,它通过按共享相同有效位置和值的单个数字对键进行分组,对具有整数键的数据进行排序

稳定排序 假设有这样一个数组:

['Kale', 'Kaleidoscope', 'Aardvark', 'Apple', 'Leicester', 'Lovely']
现在您只想按第一个字母排序:

usort($array, function($a, $b) {
    return strcmp($a[0], $b[0]);
});
结果是:

['Apple', 'Aardvark', 'Kale', 'Kaleidoscope', 'Lovely', 'Leicester']
这类东西不稳定

敏锐的观察者可能已经注意到,数组排序算法QuickSort并没有产生稳定的结果,相同第一个字母的单词之间的原始顺序也没有得到保留。这个例子很简单,我们应该比较整个字符串,但是让我们假设您的用例更复杂,例如在不同字段上的两个连续排序不应该抵消彼此的工作

施瓦茨变换

,也称为修饰-排序-取消修饰习惯用法,使用固有的不稳定排序算法实现稳定排序

首先,用另一个数组装饰每个数组元素,该数组由主键(值)和次键(索引或位置)组成:

array_walk($array, function(&$element, $index) {
    $element = array($element, $index); // decorate
});
这会将阵列转换为:

[
    ['Kale', 0], ['Kaleidoscope', 1], 
    ['Aardvark', 2], ['Apple', 3], 
    ['Leicester', 4], ['Lovely', 5]
]
现在,我们调整比较步骤;我们再次比较第一个字母,但如果它们相同,则使用辅助键保留原始顺序:

usort($array, function($a, $b) {
    // $a[0] and $b[0] contain the primary sort key
    // $a[1] and $b[1] contain the secondary sort key
    $tmp = strcmp($a[0][0], $b[0][0]);

    if ($tmp != 0) {
        return $tmp; // use primary key comparison results
    }

    return $a[1] - $b[1]; // use secondary key
});
之后,我们将拆除装饰:

array_walk($array, function(&$element) {
    $element = $element[0];
});
最终结果是:

['Aardvark', 'Apple', 'Kale', 'Kaleidoscope', 'Leicester', 'Lovely']
那么重用呢

必须重写比较函数才能使用转换后的数组元素;您可能不想编辑精致的比较函数,因此这里有一个比较函数的包装器:

function stablecmp($fn)
{
    return function($a, $b) use ($fn) {
        if (($tmp = call_user_func($fn, $a[0], $b[0])) != 0) {
            return $tmp;
        } else {
            return $a[1] - $b[1];
        }
    };
}
usort($array, stablecmp(function($a, $b) {
    return strcmp($a[0], $b[0]);
}));
让我们使用以下函数编写排序步骤:

function stablecmp($fn)
{
    return function($a, $b) use ($fn) {
        if (($tmp = call_user_func($fn, $a[0], $b[0])) != 0) {
            return $tmp;
        } else {
            return $a[1] - $b[1];
        }
    };
}
usort($array, stablecmp(function($a, $b) {
    return strcmp($a[0], $b[0]);
}));
瞧!你的原始比较
e回来了。

从PHP5.3开始,使用闭包也可以使用闭包来确定排序顺序

例如,假设$array是包含MOUNT属性的对象数组

 $orderArray = array("Jan","Feb","Mar","Apr","May","June","July","Aug","Sept","Oct","Nov","Dec");

 usort($array, function($a, $b) use ($orderArray){
       return array_search($a->month, $orderArray) - array_search($b->month, $orderArray);
 }); 
林克 在.NET中,LINQ经常用于排序,它提供了比比较函数更好的语法,特别是当对象需要按多个字段排序时。LINQ到PHP有几个端口,包括库*。有了它,数组可以用一行进行排序,而无需编写复杂的比较函数

$sortedByName         = from($objects)->orderBy('$v->name');
$sortedByCount        = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');
通过将回调作为第二个参数传递,可以进一步自定义比较,例如:

$sortedByFilenameNat  = from($objects)->orderBy('$v->filename', 'strnatcmp');
这里,$v->count是函数$v的简写形式{return$v->count;}可以使用。这些方法链返回迭代器,如果需要,迭代器可以通过在最后添加->toArray转换为数组

在内部,orderBy和相关方法调用适当的数组排序函数uasort、krsort、multisort、usort等

LINQ包含更多受SQL启发的方法:过滤、分组、连接、聚合等。它最适合在不依赖数据库的情况下对数组和对象执行复杂转换的情况


*由我开发,有关更多详细信息以及与其他LINQ端口的比较,请参见自述文件。

使用以下函数对阵列进行排序非常方便:

基本分类

按函数结果排序

排序多维数组

对象排序数组

使用比较函数进行排序


您可以看到所有这些示例。

最简单的方法是使用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;
    });
这将按结束顺序排序:

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;
    });
按键值多维排序

按键值对多维数组进行自然排序,同时保持原始顺序不要乱洗主键:

function multisortByKeyValue( $k, $arr ) {
    $ids   = array();
    $index = 1;

    foreach ( $arr as $key => $row ) {
        $ids[ $key ] = intval( $row[ $k ] ) . '-' . $index . '-' . $key;
        $index ++;
    }

    natsort( $ids );

    $arr = array_merge( $ids, $arr );

    return $arr;
}
测试用例:


有几种方法可以对数组进行排序。我将介绍一些执行此任务的方法。首先,我将给出一个称为“$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."  ";
   }
?>
<?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."  ";
    }
?>
所以,现在我想根据数组的值按升序对数组进行排序。可以使用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(8,9,3,4,0,1,2);
    sort($number);

   foreach ($number as $value) {
       echo $value."  ";
   }
?>
<?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."  ";
    }
?>
现在,关联数组按键值降序排列。请查看输出。


以下是一些在php中对数组进行升序或降序排序的方法。我希望您能有所了解。谢谢

如果您想按键值排序,那么您可以只做一行,优雅而清晰。这将按价格上涨的顺序订货。使用数组\多排序和数组\列

   Array([0] => Array ( [name] => eggs [price] => 1 ) [1] => Array ( [name] => coffee [price] => 9.99 ) [2] => Array ( [name] => rice [price] => 4.04 ) )

   array_multisort (array_column($array, 'price'), SORT_ASC, $array);
产生

     Array ( [0] => Array ( [name] => eggs [price] => 1 ) [1] => Array ( [name] => rice [price] => 4.04 ) [2] => Array ( [name] => coffee [price] => 9.99 ) )

这一页非常全面,但我想补充一点关于太空船操作符三向比较操作符的可怕实用程序——一个PHP7+的漂亮孩子

使用spaceship操作符实现多个排序条件 这在减少代码膨胀和提高可读性方面取得了巨大进步

编写自定义排序usort/uasort/uksort函数以处理多个条件时,只需在运算符的任一侧写入平衡数组并返回结果。不再嵌套条件块或多次返回

操作符两侧的元素将从左向右遍历,一次遍历一个元素,并在遇到非tie或对所有元素进行比较后立即返回计算结果

我的演示示例数据:

$multidimArray = [
    'a' => [
        'boolean' => true,
        'natString' => 'text10',
        'object' => (object)['prop' => 2],
        'float' => -.5,
        'mixed' => []
    ],
    'b' => [
        'boolean' => true,
        'natString' => 'text12',
        'object' => (object)['prop' => 4],
        'float' => 0,
        'mixed' => null
    ],
    'c' => [
        'boolean' => false,
        'natString' => 'text100',
        'object' => (object)['prop' => 9],
        'float' => -.5,
        'mixed' => false
    ],
    'd' => [
        'boolean' => true,
        'natString' => 'text1',
        'object' => (object)['prop' => 9],
        'float' => -5,
        'mixed' => "\0"
    ],
    'e' => [
        'boolean' => false,
        'natString' => 'text2',
        'object' => (object)['prop' => 2],
        'float' => .5,
        'mixed' => ''
    ]
];
为避免Stackoverflow页面膨胀的演示,请参阅以下输出:

排序逻辑:

布尔描述false=0,true=1,因此false之前为true 浮动ASC

uasort($multidimArray, function($a, $b) {
    return [$b['boolean'], $a['float']] <=> [$a['boolean'], $b['float']];
});
排序逻辑:

混合ASC 对象ASC 布尔ASC

uasort($multidimArray, function($a, $b) {
    return [$a['mixed'], $a['object']->prop, $a['boolean']] <=> [$b['mixed'], $b['object']->prop, $b['boolean']];
});
排序逻辑:

对象ASC的属性计数 混合描述的可分解性 NAT字符串长度ASC NATSING ASC

uasort($multidimArray, function($a, $b) {
    return [count(get_object_vars($a['object'])), is_iterable($a['mixed']), strlen($a['natString']), $a['natString']]
           <=>
           [count(get_object_vars($b['object'])), is_iterable($b['mixed']), strlen($b['natString']), $b['natString']];
});
此语法允许您以优雅的方式对值、函数结果、深层嵌套数据和排序方向进行排序。对于处理非数据库数据的情况来说,这绝对值得放在php工具带上,因为SQL当然是一种更明智的技术


根据您的判断,在PHP7.4中,您可以对这些匿名函数使用箭头语法

如果有人想要一个更简单的解决方案来操作数组,只需使用Laravel Collection软件包,它有一个实现的sortBy函数,可以让您简单地按键排序

$collection->sortBy('forename')->sortBy('surname');
i、 e ,为了先按a、b、c排序,正确的子句应该是

sortBy('c')->sortBy('b')->sortBy('a')

如果要根据基于多个条件的绝对最大值对数组进行排序,以下是一种简单的方法:

usort$arr,函数$item,$nextItem{ 返回max$nextItem->firstNumber,$nextItem->secondNumber-max$item->firstNumber,$item->secondNumber; }; 例如:

$foo = new stdClass;
$foo->createdDate = '10';
$foo->uploadedDate = '5';

$bar = new stdClass;
$bar->createdDate = '1';
$bar->uploadedDate = '12';

$baz = new stdClass;
$baz->createdDate = '25';
$baz->uploadedDate = '0';


$arr = [$foo, $bar, $baz];

// Order array by the highest number between "createdDate" and "uploadedDate".
usort($arr, function($item, $nextItem) {
    return (max($nextItem->createdDate, $nextItem->uploadedDate)) - (max($item->createdDate, $item->uploadedDate));
});
结果:

array (
  0 => 
  (object) array(
     'createdDate' => '25',
     'uploadedDate' => '0',
  ),
  1 => 
  (object) array(
     'createdDate' => '1',
     'uploadedDate' => '12',
  ),
  2 => 
  (object) array(
     'createdDate' => '10',
     'uploadedDate' => '5',
  ),
)


@确切地说,这就是为什么我这样做,最终有一个很好的参考问题来解决。单独回答每一片独特的雪花对任何人都没有帮助我认为人们应该简单地看看php。net@Alex哈绝对地问题是:没有人RTFM:我们已经有了这些答案,我建议你在每个答案中列出最佳答案,而不是重复或重写内容。此外,数组倾向于单独查看,因此在任何情况下都需要对重复进行投票。@deceze:如果没有人RTFM,也没有人会RTFQA-现有的Q&A:数值比较函数对浮点值不起作用;我相信你知道我的意思:对于静态顺序,我会应用array\u flip来利用更快的位置查找,例如,$order[$a['foo']],而不是array\u search$a['foo'],可能是一个很大的编辑:但是如果你认为这是一个改进,我包括了所有必要的东西,我可以应用它。@Rizier123我当然对这一努力表示赞赏,这是一部非常好的作品;但我更希望你把它作为单独的答案发布,即使它非常相似。您的重写包含了大量按引用传递的细节、大表格等,但这些细节分散了对比较函数IMHO工作原理核心主题的顺利介绍。我故意明确地参考了手册好几次,因为这样的细节应该在那里查阅;无需在此重复,也无需转移我试图传达的核心思想。@deceze由于这是一个参考问答,主要的挑战是尽可能紧凑和可读地显示信息,并让用户轻松找到他们的排序功能。我做了一些调整:但我还是要考虑一下,如果把它作为单独的答案发布是有用和有价值的,因为它非常相似content@deceze你涵盖了所有的基础知识。。我不得不寻找另一种与之相关的方法:我不认为更学术的排序方法有任何错误:对大多数应用程序来说用处不大,但偶尔它们可能会被要求/需要,这很方便,可以作为参考,特别是因为我已经忘记了这些方法中的大部分,对于快速排序,建议选择pivot作为三个值的中间值:第一个、中间个和最后一个元素。这是我的轴心选择示例。这可以避免最坏情况下的反向排序数组,如果我们只使用第一个元素作为数据透视,则会导致^2比较。我听说spl比正常数组排序更快。对吗?我同意Dave的观点,现在,几乎fw已经包含了我很少记住或使用它的原因。请记住,这将删除任何以前的相对顺序。例如,预排序列表中的第一个七月对象可能在排序后位于七月对象组的末尾。请看上面的稳定排序。你的短语对我来说是一个具有内在不稳定排序算法的稳定排序。维基百科页面上没有提到“稳定”这个词,在我看来,这是转变的美妙之处。羞耻。@TylerCollier是的,你需要在维基百科参考资料的字里行间阅读。。。我省去了你做那件事的麻烦-1示例和代码不一致。2在上述答案中已经详细解释了这一点。3您是否可能试图回答另一个问题?Deceze是否已经介绍了这些见解:它们之间的区别仅仅是键值关联是否保留在a函数中,它是从低到高排序还是反向r,它是对值还是键k排序,以及它如何将值nat与正常值进行比较。在公认的答案中?
<?php

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

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

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

     foreach ($number as $value) {
        echo $value."  ";
     }
?>
$number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2);
<?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."  ";
    }
?>
<?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."  ";
     }
?>
<?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."  ";
    }
?>
   Array([0] => Array ( [name] => eggs [price] => 1 ) [1] => Array ( [name] => coffee [price] => 9.99 ) [2] => Array ( [name] => rice [price] => 4.04 ) )

   array_multisort (array_column($array, 'price'), SORT_ASC, $array);
     Array ( [0] => Array ( [name] => eggs [price] => 1 ) [1] => Array ( [name] => rice [price] => 4.04 ) [2] => Array ( [name] => coffee [price] => 9.99 ) )
$multidimArray = [
    'a' => [
        'boolean' => true,
        'natString' => 'text10',
        'object' => (object)['prop' => 2],
        'float' => -.5,
        'mixed' => []
    ],
    'b' => [
        'boolean' => true,
        'natString' => 'text12',
        'object' => (object)['prop' => 4],
        'float' => 0,
        'mixed' => null
    ],
    'c' => [
        'boolean' => false,
        'natString' => 'text100',
        'object' => (object)['prop' => 9],
        'float' => -.5,
        'mixed' => false
    ],
    'd' => [
        'boolean' => true,
        'natString' => 'text1',
        'object' => (object)['prop' => 9],
        'float' => -5,
        'mixed' => "\0"
    ],
    'e' => [
        'boolean' => false,
        'natString' => 'text2',
        'object' => (object)['prop' => 2],
        'float' => .5,
        'mixed' => ''
    ]
];
uasort($multidimArray, function($a, $b) {
    return [$b['boolean'], $a['float']] <=> [$a['boolean'], $b['float']];
});
uasort($multidimArray, function($a, $b) {
    return [$a['mixed'], $a['object']->prop, $a['boolean']] <=> [$b['mixed'], $b['object']->prop, $b['boolean']];
});
uasort($multidimArray, function($a, $b) {
    return [count(get_object_vars($a['object'])), is_iterable($a['mixed']), strlen($a['natString']), $a['natString']]
           <=>
           [count(get_object_vars($b['object'])), is_iterable($b['mixed']), strlen($b['natString']), $b['natString']];
});
$collection->sortBy('forename')->sortBy('surname');
sortBy('c')->sortBy('b')->sortBy('a')
$foo = new stdClass;
$foo->createdDate = '10';
$foo->uploadedDate = '5';

$bar = new stdClass;
$bar->createdDate = '1';
$bar->uploadedDate = '12';

$baz = new stdClass;
$baz->createdDate = '25';
$baz->uploadedDate = '0';


$arr = [$foo, $bar, $baz];

// Order array by the highest number between "createdDate" and "uploadedDate".
usort($arr, function($item, $nextItem) {
    return (max($nextItem->createdDate, $nextItem->uploadedDate)) - (max($item->createdDate, $item->uploadedDate));
});
array (
  0 => 
  (object) array(
     'createdDate' => '25',
     'uploadedDate' => '0',
  ),
  1 => 
  (object) array(
     'createdDate' => '1',
     'uploadedDate' => '12',
  ),
  2 => 
  (object) array(
     'createdDate' => '10',
     'uploadedDate' => '5',
  ),
)