使用php在多维数组中按键排序
可能重复:使用php在多维数组中按键排序,php,multidimensional-array,sorting,ksort,Php,Multidimensional Array,Sorting,Ksort,可能重复: 如何在多维数组中按键排序 例如,下面是我从数据库打印的数组,其中最新的数组排在第一位-12月、11月、10月等和2011年、2010年、2009年等 Array ( [0] => Array ( [URL] => september 2011 [Title] => September 2011 [Date] => 8 [Month] =&g
如何在多维数组中按键排序 例如,下面是我从数据库打印的数组,其中最新的数组排在第一位-12月、11月、10月等和2011年、2010年、2009年等
Array
(
[0] => Array
(
[URL] => september 2011
[Title] => September 2011
[Date] => 8
[Month] => 9
[Year] => 2011
)
[1] => Array
(
[URL] => january 2011
[Title] => January 2011
[Date] => 1
[Month] => 2
[Year] => 2011
)
[2] => Array
(
[URL] => february 2011
[Title] => February 2011
[Date] => 4
[Month] => 1
[Year] => 2011
)
[3] => Array
(
[URL] => november 2011
[Title] => November 2011
[Date] => 23
[Month] => 11
[Year] => 2010
)
[4] => Array
(
[URL] => april 2011
[Title] => April 2011
[Date] => 23
[Month] => 4
[Year] => 2010
)
)
但我需要这样,10月、11月、12月等和2011年、2010年、2009年等-注意月份是按最老的排在第一位,但年份仍然是按最新的排在第一位
所以数组应该像这样排序
Array
(
[2] => Array
(
[URL] => february 2011
[Title] => February 2011
[Date] => 4
[Month] => 1
[Year] => 2011
)
[1] => Array
(
[URL] => january 2011
[Title] => January 2011
[Date] => 1
[Month] => 2
[Year] => 2011
)
[0] => Array
(
[URL] => september 2011
[Title] => September 2011
[Date] => 8
[Month] => 9
[Year] => 2011
)
[4] => Array
(
[URL] => april 2010
[Title] => April 2010
[Date] => 23
[Month] => 4
[Year] => 2010
)
[3] => Array
(
[URL] => november 2010
[Title] => November 2010
[Date] => 23
[Month] => 11
[Year] => 2010
)
)
这可能吗?对具有多个键的数组进行排序的通用解决方案
根据我对的回答,这里有一个非常通用的解决方案,可以在很多情况下使用
限制:由于存在匿名函数,需要PHP>=5.3才能工作
新的和改进的,现在支持降序排序
要按年份升序排序,然后按月份升序排序:
uasort($array, make_comparer('Year'));
uasort($array, make_comparer('Year', 'Month'));
uasort($array, make_comparer(array('Year', SORT_DESC), 'Month'));
要按年份降序排序,然后按月份升序排序,请执行以下操作:
uasort($array, make_comparer('Year'));
uasort($array, make_comparer('Year', 'Month'));
uasort($array, make_comparer(array('Year', SORT_DESC), 'Month'));
最后一个是您要找的。假设您在问题中提供的数据实际上是正确的(以年、月、日为基础创建排序),您可以首先根据这些值对数组进行索引,然后对主数组进行排序。我只是在写,否则您可能会误读的输出,URL/标题与给定的数值不对应,但它只是工作:
// create an index by date
foreach($data as $k=>$v)
{
$index[$k] = sprintf('%04d-%02d-%02d', $v['Year'], $v['Month'], $v['Date']);
}
// sort data based on the index
array_multisort($index, SORT_DESC, $data);
那么:
数据:
代码:
输出:
Array
(
[0] => Array
(
[URL] => february 2011
[Title] => February 2011
[Date] => 4
[Month] => 1
[Year] => 2011
)
[1] => Array
(
[URL] => january 2011
[Title] => January 2011
[Date] => 1
[Month] => 2
[Year] => 2011
)
[2] => Array
(
[URL] => september 2011
[Title] => September 2011
[Date] => 8
[Month] => 9
[Year] => 2011
)
[3] => Array
(
[URL] => april 2011
[Title] => April 2011
[Date] => 23
[Month] => 4
[Year] => 2010
)
[4] => Array
(
[URL] => november 2011
[Title] => November 2011
[Date] => 23
[Month] => 11
[Year] => 2010
)
)
非常感谢。它工作得很好@劳蒂亚姆科克:不客气,我希望你能找到它的许多用途。我会的!谢谢你的帮助!:)+1比我的更通用的解决方案。是的,那也很好!谢谢:)