我尝试使用usort()按日期对多维数组进行排序,但我似乎无法让它发挥作用。
启动数组:
$dayEvents = array();
$dayEvents['output'] = array();
它的分配方式如下:
$dayEvents['output'][] = array('date' => $dateStamp, 'data' => $dataOutput, 'ad' => $allDay);
示例输出:
array(1) {
["output"]=>
array(6) {
[0]=>
array(3) {
["date"]=>
string(19) "2014-03-12 00:00:00"
["data"]=>
string(115) "
2 tests were booked
"
["ad"]=>
int(1)
}
[1]=>
array(3) {
["date"]=>
string(19) "2014-03-12 08:30:00"
["data"]=>
string(316) "
08:30am
Matamata Class 1 R & F
"
["ad"]=>
int(0)
}
[2]=>
array(3) {
["date"]=>
string(19) "2014-03-12 08:00:00"
["data"]=>
string(319) "
08:00am-04:00pm
Truck Course
"
["ad"]=>
int(0)
}
[3]=>
array(3) {
["date"]=>
string(19) "2014-03-12 08:00:00"
["data"]=>
string(328) "
08:00am-03:30pm
Trade Ed Rot Class 2
"
["ad"]=>
int(0)
}
[4]=>
array(3) {
["date"]=>
string(19) "2014-03-12 08:00:00"
["data"]=>
string(326) "
08:00am-03:30pm
Trade Ed Tga Class 2
"
["ad"]=>
int(0)
}
[5]=>
array(3) {
["date"]=>
string(19) "2014-03-12 17:00:00"
["data"]=>
string(330) "
05:00pm-08:00pm
Tauranga Truck Course
"
["ad"]=>
int(0)
}
}
}
对其进行排序的声明:
if(count($dayEvents['output'])>1) {
uasort($dayEvents, 'date_compare');
}
功能本身:
function date_compare($a, $b) {
return strtotime($a['date']) > strtotime($b['date']);
}
最后输出数据
foreach($dayEvents as $outputData) {
$calendar .= $outputData['data'];
}
但它并没有按日期排序,我收到错误Notice: Undefined index: data
任何人都可以看到我出错的地方吗?我以前从未使用过usort,而且我试图通过此处的问题提供的所有说明似乎都不起作用。
答案 0 :(得分:1)
PHP中的数组排序函数仅适用于一维数组。要对2D数组进行排序,您可以使用我以下常用于此类任务的以下函数:
function array_sort_by_column(&$array, $column, $direction = SORT_ASC) {
$reference_array = array();
foreach($array as $key => $row) {
$reference_array[$key] = $row[$column];
}
array_multisort($reference_array, $direction, $array);
}
调整了您的代码:
array_sort_by_column($dayEvents['output'], 'date');
答案 1 :(得分:1)
我认为问题出在你的foreach声明中。而不是:
foreach($dayEvents as $outputData) {
你需要这个:
foreach($dayEvents['output'] as $outputData) {
对于第一个语句,数据未定义,因为该数组中有一个名为“output”的元素。在第二个中,应该定义“数据”。
您可能还需要将其添加到您的uasort调用中:
uasort($dayEvents['output'], 'date_compare');