【问题标题】:PHP Typecasting an Int as a String - doesn't seem to work as expectedPHP 将 Int 类型转换为字符串 - 似乎没有按预期工作
【发布时间】:2012-02-23 12:35:41
【问题描述】:

我正在尝试计算数据库中用户的百分位数。为此,我需要对 $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] 时它确实有效,但这对我来说并不是正确的解决方案!

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

【问题讨论】:

  • 假设您尝试按用户 ID 排序,$data 在这里看起来不是多维的,为什么不能使用 asort()php.net/manual/en/function.asort.php
  • 不,我正在尝试按值排序(number_format([...]) 等)。但我想保留用户 ID 作为键,以便以后可以将用户 ID 与他们的百分位值联系起来。
  • 刚刚说过...asort() 似乎做得很好!
  • 抱歉,我不是说按用户ID排序,这是关键,asort()会按数组的值排序并保持关联。

标签: php arrays string variables casting


【解决方案1】:

我认为你把事情复杂化了。在没有测试的情况下,我认为像这样索引$data-array 会起作用:

$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() 解决方案。

【讨论】:

  • 我刚刚尝试了这两个建议,但我仍然得到完全相同的输出。我将编辑我的问题以澄清 print_r() 输出的内容。
  • 我不认为它会起作用,因为我记得已经遇到过这个问题,并且当键是数字时 PHP 将重新索引表,即使您明确地将其转换为字符串 (但已经有一段时间了,从那以后我没有重新测试)。
  • 我已经更新了我的答案,为解决这个(和类似的)问题提供了更多的想法。取决于具体需求,哪个是最好的。
【解决方案2】:

正如我在评论中所描述的,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);

如果您希望在排序后对reverse the array 进行降序百分比。

$data = array_reverse($data, true);

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 2020-09-15
    • 2016-01-24
    • 1970-01-01
    • 2022-12-17
    • 2021-06-07
    • 2013-02-10
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多