【问题标题】:Sort a single array on key in desc or asc [duplicate]在 desc 或 asc 中按键对单个数组进行排序 [重复]
【发布时间】:2014-09-16 09:17:09
【问题描述】:

有没有办法可以按 desc 或 asc 顺序在特定键上对该数组进行排序?

<?php 
$array = array(
   "samaccountname" => "Mark", => "age" => "26", 
   "samaccountname" => "John", => "age" => "50", 
   "samaccountname" => "Peter", => "age" => "31", 
   "samaccountname" => "Dennis", "age" => "21"
); 
?>

类似:

ksort($array,'samaccountname','SORT_DESC');

【问题讨论】:

  • 在其他新闻中,您的数组定义已损坏,您不能在单个数组键定义中包含多个 =&gt; 运算符

标签: php arrays sorting ksort


【解决方案1】:

您可以使用usort 编写自定义排序函数。这样就可以通过对数组的子数组的特定键进行排序。您甚至可以将其包装在您自己的函数中:

<?php
// Fixed syntax of your nested array:
$array = array(
   array("samaccountname" => "Mark", "age" => "26"), 
   array("samaccountname" => "John", "age" => "50"), 
   array("samaccountname" => "Peter", "age" => "31"), 
   array("samaccountname" => "Dennis", "age" => "21")
); 

/**
 * Sorts a nested array by the value of the specified key. Can sort ascending or descending */
 */
function myksort(&$array, $subkey, $sort = SORT_ASC)
{
    return usort($array,
        // The callback function. Make sure it can use $subkey and $sort.
        function($a, $b) use ($subkey, $sort) {
            // Compare the items respecting the sort.
            if ($sort == SORT_DESC)
              return strcmp($b[$subkey], $a[$subkey]);
            else
              return strcmp($a[$subkey], $b[$subkey]);
        });
}

// Sort the array by 'samaccountname'
myksort($array, 'samaccountname');

// Show the results.
var_dump($array);

// Sort the array by 'samaccountname', but descending.
myksort($array, 'samaccountname', SORT_DESC);

// Show the results.
var_dump($array);

比较函数本身也可以更短,如果你这样写的话,但我认为if..else 更具可读性。

return strcmp($a[$subkey], $b[$subkey]) * ($sort == SORT_DESC?-1,1);

【讨论】:

  • 谢谢,这就像一个魅力!正是我想要的。
【解决方案2】:

您可以使用array_multisort() 来处理这类事情。因为array_multisort() 需要一个列数组,所以您需要创建另一个数据结构来进行排序。请参阅array_multisort() 上的 PHP 文档中的示例 #3。

$myarr = array(
  array("samaccountname" => "Mark", "age" => "26"), 
  array("samaccountname" => "John", "age" => "50"), 
  array("samaccountname" => "Peter", "age" => "31"), 
  array("samaccountname" => "Dennis", "age" => "21")); 

foreach ($myarr as $key => $row) {
       $samaccountname[$key] = $row['samaccountname'];
       $age[$key] = $row['age'];
}

array_multisort($samaccountname, SORT_DESC, $myarr);
var_dump($myarr);

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2020-03-06
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多