1

我有以下数组:

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。目前排序是根据数据库的常规方式进行的,但我想根据状态表示最后一个值对其进行排序。我希望 live 应该首先出现,然后是即将到来的 2nd 和 NA 3rd。使用 order-by 查询是不可能的,因为状态不是来自数据库。它来自 API,我只是将它与数据库数组合并。

希望你明白我的意思。

谢谢。

4

2 回答 2

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;
}

有关回调的更多信息,您可以参考此页面

于 2013-04-12T18:10:49.217 回答
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);

在行动中看到它。

于 2013-04-12T18:20:23.633 回答