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'];
});
编辑 这个答案至少有十年历史了,现在可能有更好的解决方案,但我在几条评论中补充了一些额外的信息 这是因为
array\u multisort()
可以对多个数组进行排序。输入示例:
Array
(
[0] => Array
(
[hashtag] => a7e87329b5eab8578f4f1098a152d6f4
[title] => Flower
[order] => 3
)
[1] => Array
(
[hashtag] => b24ce0cd392a5b0b8dedc66c25213594
[title] => Free
[order] => 2
)
首先制作一个二维数组,其值为我们要排序的值,键与输入数组匹配。例如,对于此输入,选择键$sort\u col
“order”
我们得到:
Array
(
[0] => 3,
[1] => 2
)
array\u multisort()
然后对该数组进行排序(产生键顺序1,0
),但这只是二维数组。因此,原始输入数组也作为$rest
参数传递。当关键点匹配时,将对其进行排序,使其关键点的顺序也相同,从而得到所需的结果
注:
- 它通过引用传递,以便在适当的位置修改提供的数组
可以像这样对多个附加数组进行排序,而不仅仅是一个数组array\u multisort()
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我无法确定您的目标是什么