Php 如何按值对多维数组排序
如何根据“order”键的值对该数组进行排序 尽管这些值当前是连续的,但它们并不总是连续的Php 如何按值对多维数组排序,php,arrays,sorting,multidimensional-array,Php,Arrays,Sorting,Multidimensional Array,如何根据“order”键的值对该数组进行排序 尽管这些值当前是连续的,但它们并不总是连续的 Array ( [0] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) [1] => Array (
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
)
)
我使用此功能:
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');
usort($myArray, function($a, $b) {
return $a['order'] - $b['order'];
});
我通常使用,并通过我自己的比较功能。在这种情况下,非常简单:
function compareOrder($a, $b)
{
return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');
在PHP 7中,使用spaceship操作符:
usort($array, function($a, $b) {
return $a['order'] <=> $b['order'];
});
usort($array,function($a,$b){
返回$a['order']$b['order'];
});
试试看。如果您仍然使用PHP 5.2或更早版本,则必须首先定义排序函数:
function sortByOrder($a, $b) {
return $a['order'] - $b['order'];
}
usort($myArray, 'sortByOrder');
从PHP 5.3开始,您可以使用匿名函数:
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');
usort($myArray, function($a, $b) {
return $a['order'] - $b['order'];
});
最后,对于PHP 7,您可以使用:
usort($myArray,function($a,$b){
返回$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;
});
usort($myArray,function($a,$b){
$retval=$a['order']$b['order'];
如果($retval==0){
$retval=$a['suborder']$b['suborder'];
如果($retval==0){
$retval=$a['details']['subsuborder']$b['details']['subsuborder'];
}
}
返回$retval;
});
如果需要保留密钥关联,请使用uasort()
-请参阅手册中的
$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);
这将同时处理大写和小写字母。要根据“title”键的值对数组进行排序,请使用:
uasort($myArray, function($a, $b) {
return strcmp($a['title'], $b['title']);
});
strcmp比较字符串
uasort()按照定义维护数组键。让我们面对现实:PHP没有一个简单的现成函数来正确处理每个数组排序场景
此例程直观,意味着更快的调试和维护:
// Automatic population of the array
$tempArray = array();
$annotations = array();
// ... some code
// SQL $sql retrieves result array $result
// $row[0] is the ID, but is populated out of order (comes from
// multiple selects populating various dimensions for the same DATE
// for example
while($row = mysql_fetch_array($result)) {
$needle = $row[0];
arrayIndexes($needle); // Create a parallel array with IDs only
$annotations[$needle]['someDimension'] = $row[1]; // Whatever
}
asort($tempArray);
foreach ($tempArray as $arrayKey) {
$dataInOrder = $annotations[$arrayKey]['someDimension'];
// .... more code
}
function arrayIndexes ($needle) {
global $tempArray;
if (!in_array($needle, $tempArray)) {
array_push($tempArray, $needle);
}
}
实现这一目标的一种方法是这样
$new = [
[
'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
'title' => 'Flower',
'order' => 3,
],
[
'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
'title' => 'Free',
'order' => 2,
],
[
'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
'title' => 'Ready',
'order' => 1,
],
];
$keys = array_column($new, 'order');
array_multisort($keys, SORT_ASC, $new);
var_dump($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
)
)
最灵活的方法是使用以下方法:
Arr::sortByKeys(array $array, $keys, bool $assoc = true): array
原因如下:
- 您可以按任意键进行排序(也可以嵌套,如
或'key1.key2.key3'
)['k1','k2','k3']
- 它同时适用于关联数组和非关联数组(
标志)$assoc
- 它不使用引用-它返回一个新的排序数组
$sortedArray = Arr::sortByKeys($array, 'order');
此方法是。使用array\u multisort()
,array\u map()
如果有人需要根据键进行排序,最好使用以下选项:
usort($array, build_sorter('order'));
function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
此解决方案适用于usort(),具有易于记忆的多维排序符号。使用spaceship操作符,可从PHP7获得
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
;
});
第一个任务:按等级asc排序,姓氏asc
usort($in,function($a,$b){
return $a['rank'] <=> $b['rank'] //first asc
?: $a['surname'] <=> $b['surname'] //second asc
;
});
usort($in,function($a,$b){
返回$a['rank']$b['rank']//第一个asc
?:$a['姓氏]$b['姓氏]//第二个asc
;
});
第二项任务:按等级描述、姓氏asc、firstmame 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
;
});
usort($in,function($a,$b){
返回$b['rank']$a['rank']//第一个描述
?:$a['姓氏]$b['姓氏]//第二个asc
?:$a['firstname']$b['firstname']//第三个asc
;
});
第三项任务:按等级描述、出生日期asc排序
日期不能按此符号排序。它是用strottime转换的
usort($in,function($a,$b){
return $b['rank'] <=> $a['rank'] //first desc
?: strtotime($a['birthdate']) <=> strtotime($b['birthdate']) //second asc
;
});
usort($in,function($a,$b){
返回$b['rank']$a['rank']//第一个描述
?:strotime($a['birthdate'])strotime($b['birthdate'])//第二个asc
;
});
您可以使用usort
和带有回调函数的用户定义排序函数:
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');
usort($myArray, function($a, $b) {
return $a['order'] - $b['order'];
});
usort($new,fn($a,$b)=>a['order']-$b['order']);
技巧:您可以使用
a>b
或a-b
或ab
进行升序排序。对于降序排列,只需将a
和b
的交换位置交叉链接:最快的方法是使用同构模块,该模块在浏览器和节点中都可以本地工作,支持任何类型的输入,计算字段和自定义排序顺序。这如何回答按特定数组键排序的问题?@Nitro此答案缺少教育性解释。这个答案似乎是对另一个问题的正确答案。“让我们面对现实:php没有一个简单的开箱即用的函数来正确处理每个数组排序场景。”这正是usort/ksort/asort为^^而设计的,实际上PHP可以用来处理每一个数组排序场景。关于调试和维护,使用global
是一个巨大的危险信号,而且非常重要。为什么针对这个问题演示的是mysql\u fetch\u array
,而不是OP的源数组,并且没有解释您的代码在做什么以及预期的结果是什么?总的来说,这是一种非常复杂的方法来实现预期的最终结果。@tonygil我无法从你的答案和OP的数据集中确定你的预期结果。这对你来说可能很明显,但我不知道你的答案如何回答OP的问题。但是,您可以不使用global
请参见:这将生成一个显式定义的变量,而不是一个可以全局更改和访问的变量。请注意,这种方法将发出通知array\u multisort
引用了它的第一个参数。@Kami在现成的演示链接中没有证据表明您的声明。我不会使用这个答案,因为array\u column()
更合适/简洁。这是ajuchacko91先前发布的答案的一个不太精炼的版本。基于示例4,这个答案缺少教育性解释。一个循环,然后是本机排序,然后是另一个循环?当然不是页面上最优雅或最有表现力的片段。应该有一个解释。这个答案缺少教育性的解释。应该有一个解释。例如,想法/要点是什么?与其他解决方案相比,折衷方案是什么?性能特点是什么