PHP将Int作为字符串进行类型转换 - 似乎没有按预期工作

时间:2012-02-23 12:35:41

标签: php arrays string variables casting

我正在尝试计算数据库中用户的百分位数。为了做到这一点,我有一个$data数组,我需要排序。

我有一个包含User_IDTotal_User_OrdersTotal_Orders的查询对象。以下是代码到目前为止的显示方式:

// Loop through the users
foreach($query->result() as $row)
{
    (string)$user_id = (string)$row->user_id;

    $data[$user_id] = number_format((($row->total_user_orders/$row->total_orders)*100), 5);
}

// Sort the $data array
array_multisort($data);

print_r($data);

我认为应该做的是将$row->user_id(一个int)作为字符串进行类型转换。然后,$data[$user_id]索引应设置为字符串 - 右...?

当我使用array_multisort对数组进行排序时,它会对其进行排序,就像索引是整数而不是字符串一样。这意味着它失去了索引。

array_multisort()状态的PHP手册,"关联(字符串)键将被维护,但数字键将被重新编入索引。" 。我也尝试使用array_multisort($data, SORT_STRING),但会出现相同的输出。但是 - 当我$data['#'.$user_id]时,它确实有效,但这对我来说并不是一个合适的解决方案!

有人可以帮忙吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

我认为你过于复杂。没有测试,我认为像这样索引$data - 数组会起作用:

$data[(string)$row->user_id] = ...

$data[''.$user_id] = ...

修改
否则,您可以构建多维数组并按其中一个索引排序,如下所示:

foreach($query->result() as $row) {
  $data[] = array(
    'user_id' => $row->user_id,
    'percent' => number_format((($row->total_user_orders/$row->total_orders)*100), 5);
  );
}

或者您可以按百分比编制索引并按键排序(使用ksort()):

foreach($query->result() as $row) {
  $data[number_format((($row->total_user_orders/$row->total_orders)*100), 5)] = $row->user_id];
}

如果多个用户具有相同的百分比,则最后一个解决方案可能会很危险。

就个人而言,我可能会采用上面提到的asort()解决方案。

答案 1 :(得分:1)

正如我的评论中所述,array_multisort()不是您在此之后所做的。您没有多个数组或多维数组。

要维护数组中的key => value关联并使用asort()对内容进行排序。

foreach ($query->result() as $row) {
    $percent = ($row->total_user_orders / $row->total_orders) * 100;
    $data[$row->user_id] = number_format($percent, 5);
}
asort($data);

如果您希望在排序后降低{%3}的百分比。

$data = array_reverse($data, true);