我需要根据getNotifications函数的值"start_date"DESC顺序对通知数组进行排序:
$posts_id_arr = getPoststIds($conn);
foreach ($posts_id_arr as $key => $val) {
$total_arr[$key] = [
'notification' => getNotifications($val['post_id'], $user_id, $conn)
];
}
$response_array = array('data' => $total_arr, 'more things' => $more_array);
echo json_encode($response_array);
由于foreach循环,现在的顺序是post-id。
data {
notification:
[
{
post_id: “1",
start_date: "2016-10-10 08:00:00",
},
{
post_id: “1",
start_date: "2016-10-10 12:00:00",
}
],
notification:
[
post_id: “2",
start_date: "2016-10-10 09:00:00",
},
{
post_id: “2",
start_date: "2016-10-10 13:00:00",
}
]
}
我需要它是1:08:00,2:09:00,1:12:00,2:13:00
您可以使用自定义函数使用uasort对数组中的值进行排序。您的日期格式可以使用strcmp
进行排序——过去的日期低于未来的日期,因此您可以在比较器中使用它。
function sort_by_date($a, $b) {
return strcmp($a->start_date, $b->start_date);
}
$sorted_posts = uasort($total_arr->notification, 'sort_by_date');
$response_array = array('data' => $sorted_posts, 'more things' => $more_array);
但是,您不需要在foreach
内部执行排序。
你可以试试下面的代码。相应地更改变量名称。
foreach ($points as $key => $val) {
$time[$key] = $val[0];
}
array_multisort($time, SORT_ASC, $points);
这是因为array_multisort
的工作方式。它对多个数组进行排序,当对$time
数组进行排序时,$points数组将根据$time中的数组索引重新排序。array_multiport应该在foreach之后,不过
希望这会有所帮助。
如果您想使用内部数组进行排序,您可以更好地选择usort()
方法。
usort—使用用户定义的比较函数按值对数组进行排序
此函数将使用用户提供的比较函数按数组的值对数组进行排序。如果要排序的数组需要按照一些非平凡的标准进行排序,则应该使用此函数。
<?php
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}
$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";
usort($fruits, "cmp");
while (list($key, $value) = each($fruits)) {
echo "'$fruits[$key]: " . $value["fruit"] . "'n";
}
?>
对多维数组进行排序时,$a
和$b
包含对数组第一个索引的引用。
上面的例子将输出:
$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons
替代解决方案:
您可以尝试array_multisort()
,因为它会根据您需要的顺序对数组进行排序。
$arr = your array;
$sort = array();
foreach($arr as $k=>$v) {
$sort['field'][$k] = $v['field'];
}
array_multisort($sort['field'], SORT_DESC, $arr);
echo "<pre>";
print_r($arr);
您可以按照以下步骤操作:
1( 定义一个临时数组来存储日期:
foreach ($total_arr['notification'] as $vals) {
$temp_dates[] = $vals['start_date'];
}
2( 使用arsort()
:对新创建的临时数组进行排序
arsort($temp_dates);
3( 使用array_filter()
和循环查找相应的post-id并存储到生成的数组:
$i = 0;
foreach ($total_arr['notification'] as $vals) {
$res['notification'][] = array_filter($vals, function($val) {
return $val['start_date'] == $temp_dates[$i];
});
$i++;
}
$response_array = array('data' => $res, 'more things' => $more_array);
注意:不确定它是否适用于重复的start_date
s。
正如iblamefish所提到的,使用uasort()
是一种方法——与所有其他答案相比,它很简单,内存和处理效率都很高。但是,尽管strcmp()
确实为您所拥有的SQL风格的日期产生了良好的结果;正确的";处理时间字段的方法-您应该解析时间并将其作为时间值进行比较:
$a = [
[ "name" => "foo", "date" => "2016-08-09 10:30:00" ],
[ "name" => "bar", "date" => "2016-01-09 02:00:00" ],
[ "name" => "baz", "date" => "2016-11-02 18:21:34" ]
];
uasort($a, function($a,$b) {
return (new DateTime($a->date))->getTimestamp() - (new DateTime($b->date))->getTimestamp();
});
var_dump($a);
生产:
array(3) {
[0] =>
array(2) {
'name' =>
string(3) "foo"
'date' =>
string(19) "2016-08-09 10:30:00"
}
[1] =>
array(2) {
'name' =>
string(3) "bar"
'date' =>
string(19) "2016-01-09 02:00:00"
}
[2] =>
array(2) {
'name' =>
string(3) "baz"
'date' =>
string(19) "2016-11-02 18:21:34"
}
}
此外,闭包(匿名函数(比使用老式的"匿名函数"更有趣;文本可调用"(。