我有以下数组:
Array
(
[0] => 147
[1] => hello
[2] => Asia/Kolkata
[3] => Upcoming
)
Array
(
[0] => 148
[1] => hello world
[2] => Asia/Karachi
[3] => Live
)
Array
(
[0] => 147
[1] => ABCD
[2] => Asia/Colombo
[3] => NA
)
以上数组来自数据库,期望最后的第6个值来自API动态。我已使用数组推送将该值推送到数据库数组。
请参阅以下代码:
function compareArrayItems($a, $b) {
$order = array(
"Live",
"Upcoming",
"NA"
);
$aWeight = array_search($a[9], $order);
$bWeight = array_search($b[9], $order);
if ($aWeight === false || $bWeight === false || $aWeight === $bWeight)
return 0;
return $aWeight < $bWeight ? 1 : - 1;
}
$sArr = array();
while ($kj = mysqli_fetch_array($result)) {
$arrk = get_status_for_hashtag($kj['start_time'], $kj['end_time'], $kj['day'], $kj['timezone']);
array_push($kj, $arrk);
$sArr[] = $kj;
}
usort($sArr, "compareArrayItems");
这里的状态只是最后一个值:即将到来的,现场的,NA。目前排序是按照数据库的常规方式进行,但我想根据状态对最后一个值进行排序。我希望现场应先到,然后即将到来的第二和NA第三。使用order-by查询无法实现,因为状态不是来自数据库。它来自API,我只是将它与数据库数组合并。
希望你明白我的意思。
感谢。
答案 0 :(得分:2)
您可以使用usort提供自定义$cmp_function
比较$a[3]
和$b[3]
值。
<强>更新强>
以下是一个使用示例:
$arr = array(
array(147, "hello", "Asia/Kolkata", "Upcoming"),
array(148, "hello world", "Asia/Karachi", "Live"),
array(147, "ABCD", "Asia/Colombo", "NA"),
);
print_r($arr);
usort($arr, "compareArrayItems");
print_r($arr);
和自定义函数,用于按顺序排列数组项目“Live”,“Upcoming”,“NA”:
function compareArrayItems($a, $b)
{
$order = array(
"Live",
"Upcoming",
"NA"
);
$aWeight = array_search($a[3], $order);
$bWeight = array_search($b[3], $order);
if ($aWeight === false || $bWeight === false || $aWeight === $bWeight)
return 0;
return $aWeight > $bWeight ? 1 : - 1;
}
有关回调的详细信息,请参阅this page。
答案 1 :(得分:1)
$rows = $result->fetch_all(MYSQLI_ASSOC);
$sort = [];
foreach ($rows as &$row)
{
$row[] = $sort[] = get_status_for_hashtag($row['timezone']);
}
unset($row);
array_multisort($sort, $rows);