我有一个数组,其键是日期,我想按升序排序。我尝试用ksort()和其他无法解决的排序方法对其进行排序。使用usort()排序也不起作用。
这是我的数组
array:7 [▼
"21-07-2017" => array:1 [▶]
"04-09-2017" => array:3 [▶]
"27-07-2017" => array:1 [▶]
"31-07-2017" => array:1 [▶]
"01-08-2017" => array:2 [▶]
"05-09-2017" => array:1 [▶]
"15-09-2017" => array:1 [▶]
]
这就是我所做的。
usort($date, function($a, $b) {
foreach ($a as $value1) {
foreach ($b as $value2) {
return ($value1['date'] < $value2['date']) ? -1 : 1;
}
}
});
php中有没有内置的功能,我不知道了吗?
答案 0 :(得分:1)
按strtotime
函数将日期转换为字符串,然后使用ksort
$temp = array();
foreach($arr as $key=>$value){
$temp[strtotime($key)] = $value;
}
ksort($temp);
$new = array();
foreach($temp as $key=>$value){
$new[date("d-m-Y",$key)] = $value;
}
print_r($new);
答案 1 :(得分:0)
您的日期值未采用 Y-m-d
格式 -- 一种可以简单地自然排序为字符串值的格式。如果日期/时间单位没有按从大到小的顺序排列,则需要解析字符串并将其转换为可以正确比较的格式。
您的日期格式已经是欧洲格式,strtotime()
将正确解析该值。使用 uksort()
比较转换为 unix 时间后的值。这将在不修改原始键的情况下对数组 ASC 进行排序。
代码:(Demo)
$array = [
"21-07-2017" => ['a'],
"04-09-2017" => ['b'],
"27-07-2017" => ['c'],
"31-07-2017" => ['d'],
"01-08-2017" => ['e'],
"05-09-2017" => ['f'],
"15-09-2017" => ['g'],
];
uksort($array, function($a, $b) { return strtotime($a) <=> strtotime($b);});
var_export($array);
输出:
array (
'21-07-2017' =>
array (
0 => 'a',
),
'27-07-2017' =>
array (
0 => 'c',
),
'31-07-2017' =>
array (
0 => 'd',
),
'01-08-2017' =>
array (
0 => 'e',
),
'04-09-2017' =>
array (
0 => 'b',
),
'05-09-2017' =>
array (
0 => 'f',
),
'15-09-2017' =>
array (
0 => 'g',
),
)