This question already has an answer here:
这个问题在这里已有答案:
- How can I sort arrays and data in PHP? 8 answers
- 如何在PHP中对数组和数据进行排序? 8个答案
I'm trying to sort my PHP hashtable based on a specifc key. The datastructure looks like this:
我正在尝试根据特定的密钥对我的PHP哈希表进行排序。数据结构如下所示:
print_r($mydata);
Array(
[0] => Array
(
[type] => suite
[name] => A-Name
)
[1] => Array
(
[type] => suite
[name] => C-Name
)
[2] => Array
(
[type] => suite
[name] => B-Name
)
)
I've tried ksort, sort, usort but nothing seems to work. I'm trying to sort based on the name key two-levels down.
我尝试过ksort,sort,usort但似乎没什么用。我正在尝试根据名称键两级下来排序。
This was my attempt using usort:
这是我尝试使用usort:
function cmp($a, $b) {
return $b['name'] - $a['name'];
}
usort($mydata, "cmp");
Is there an easy way to do this or do I need to write a custom sort function?
有没有一种简单的方法可以做到这一点,还是我需要编写自定义排序功能?
6 个解决方案
#1
54
Thinking,more useful and practical http://php.net/manual/en/function.sort.php
思考,更实用,更实用http://php.net/manual/en/function.sort.php
function array_sort($array, $on, $order=SORT_ASC){
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
How to use
如何使用
$list = array(
array( 'type' => 'suite', 'name'=>'A-Name'),
array( 'type' => 'suite', 'name'=>'C-Name'),
array( 'type' => 'suite', 'name'=>'B-Name')
);
$list = array_sort($list, 'name', SORT_ASC);
array(3) { [0]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "A-Name" } [2]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "B-Name" } [1]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "C-Name" } }
#2
8
Try this usort function:
试试这个usort函数:
function cmp($a, $b){
if ($a == $b)
return 0;
return ($a['name'] < $b['name']) ? -1 : 1;
}
$my_array = array(
0 => array
(
'type' => 'suite'
,'name' => 'A-Name'
)
,1 => array
(
'type' => 'suite'
,'name' => 'C-Name'
)
,2 => array
(
'type' => 'suite'
,'name' => 'B-Name'
)
);
usort($my_array, "cmp");
If you using it in a class, the second parameter changes to an array like this:
如果在类中使用它,则第二个参数将更改为如下数组:
usort($my_array, array($this,'cmp'));
#4
1
<?php
$a=array(
array('a'=>5,'b'=>7),array('c'=>4,'d'=>2),array('e'=>0,'f'=>12)
);
function cmp_sort($x,$y){ //your function to compare two keys
if($x===$y)
return 0;
else
return ($x<$y?1:-1);
}
uasort($a,'cmp_sort'); //call user-defined compare function
print_r($a); //printing the sorted array
?>
Output=>
输出=>
Array ( [2] => Array ( [e] => 0 [f] => 12 ) [1] => Array ( [c] => 4 [d] => 2 ) [0] => Array ( [a] => 5 [b] => 7 ) )
数组([2] =>数组([e] => 0 [f] => 12)[1] =>数组([c] => 4 [d] => 2)[0] =>数组([] a] => 5 [b] => 7))
#5
0
$this->aasort($array,"key");
function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
$sorter[]=$va[$key];
}
arsort($sorter);
foreach ($sorter as $ii => $va) {
$ret[]=$array[$ii];
}
return $array=$ret;
}
#6
0
try this recursive mode, that I used in Magento REST API:
尝试这种我在Magento REST API中使用的递归模式:
$parameters = ['searchCriteria' => ['currentPage' => 1, 'pageSize' => 20]];
$parameters['searchCriteria']['filter_groups'][0]['filters'][0] = ['condition_type' => 'from', 'field' => 'updated_at', 'value' => '2017-01-01T00:00:00'];
$parameters['searchCriteria']['filter_groups'][1]['filters'][0] = ['condition_type' => 'to', 'field' => 'updated_at', 'value' => '2017-12-31T23:59:59'];
function sortArrayByKeyAsc($_params){
if(is_array($_params)){
uksort($_params, 'strnatcmp');
foreach ($_params as $key => $value){
if(is_array($value)){
$_params[$key] = sortArrayByKeyAsc($value);
}
}
}
return $_params;
}
#1
54
Thinking,more useful and practical http://php.net/manual/en/function.sort.php
思考,更实用,更实用http://php.net/manual/en/function.sort.php
function array_sort($array, $on, $order=SORT_ASC){
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
How to use
如何使用
$list = array(
array( 'type' => 'suite', 'name'=>'A-Name'),
array( 'type' => 'suite', 'name'=>'C-Name'),
array( 'type' => 'suite', 'name'=>'B-Name')
);
$list = array_sort($list, 'name', SORT_ASC);
array(3) { [0]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "A-Name" } [2]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "B-Name" } [1]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "C-Name" } }
#2
8
Try this usort function:
试试这个usort函数:
function cmp($a, $b){
if ($a == $b)
return 0;
return ($a['name'] < $b['name']) ? -1 : 1;
}
$my_array = array(
0 => array
(
'type' => 'suite'
,'name' => 'A-Name'
)
,1 => array
(
'type' => 'suite'
,'name' => 'C-Name'
)
,2 => array
(
'type' => 'suite'
,'name' => 'B-Name'
)
);
usort($my_array, "cmp");
If you using it in a class, the second parameter changes to an array like this:
如果在类中使用它,则第二个参数将更改为如下数组:
usort($my_array, array($this,'cmp'));
#3
#4
1
<?php
$a=array(
array('a'=>5,'b'=>7),array('c'=>4,'d'=>2),array('e'=>0,'f'=>12)
);
function cmp_sort($x,$y){ //your function to compare two keys
if($x===$y)
return 0;
else
return ($x<$y?1:-1);
}
uasort($a,'cmp_sort'); //call user-defined compare function
print_r($a); //printing the sorted array
?>
Output=>
输出=>
Array ( [2] => Array ( [e] => 0 [f] => 12 ) [1] => Array ( [c] => 4 [d] => 2 ) [0] => Array ( [a] => 5 [b] => 7 ) )
数组([2] =>数组([e] => 0 [f] => 12)[1] =>数组([c] => 4 [d] => 2)[0] =>数组([] a] => 5 [b] => 7))
#5
0
$this->aasort($array,"key");
function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
$sorter[]=$va[$key];
}
arsort($sorter);
foreach ($sorter as $ii => $va) {
$ret[]=$array[$ii];
}
return $array=$ret;
}
#6
0
try this recursive mode, that I used in Magento REST API:
尝试这种我在Magento REST API中使用的递归模式:
$parameters = ['searchCriteria' => ['currentPage' => 1, 'pageSize' => 20]];
$parameters['searchCriteria']['filter_groups'][0]['filters'][0] = ['condition_type' => 'from', 'field' => 'updated_at', 'value' => '2017-01-01T00:00:00'];
$parameters['searchCriteria']['filter_groups'][1]['filters'][0] = ['condition_type' => 'to', 'field' => 'updated_at', 'value' => '2017-12-31T23:59:59'];
function sortArrayByKeyAsc($_params){
if(is_array($_params)){
uksort($_params, 'strnatcmp');
foreach ($_params as $key => $value){
if(is_array($value)){
$_params[$key] = sortArrayByKeyAsc($value);
}
}
}
return $_params;
}