如何按“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
)
)
答案 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);
答案 13 :(得分:0)
您可以使用 usort
和带有回调函数的用户定义的排序函数:
usort($new, fn($a, $b) => $a['order'] - $b['order']);
技巧:您可以使用 a > b
或 a - b
或 a <=> b
按升序排序。对于降序订单,只需a
和b
的互换位置。