PHP, типизирующий Int как строку - PullRequest
0 голосов
/ 23 февраля 2012

Я пытаюсь рассчитать процентили для пользователей в базе данных. Для этого у меня есть массив $data, который мне нужно отсортировать.

У меня есть объект запроса, который содержит User_ID, Total_User_Orders и Total_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);

Что (я считаю), что следует сделать, это typecast $row->user_id (int) в виде строки. Тогда индекс $data[$user_id] должен быть задан как строка - правильно ...?

Когда я сортирую массив, используя array_multisort, он сортирует его так, как если бы индекс был целым числом, а не строкой . Это означает, что он теряет индекс.

Руководство по PHP для array_multisort() состояний, "Ассоциативные (строковые) ключи будут сохранены, но числовые ключи будут переиндексированы." . Я также пытался использовать array_multisort($data, SORT_STRING), но такой же вывод происходит. Тем не менее - это работает, когда я $data['#'.$user_id], но это не совсем похоже на правильное решение для меня!

Кто-нибудь может помочь? Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Я думаю, вы слишком усложняете вещи. Без тестирования я думаю, что индексирование массива $data будет работать так:

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

или

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

EDIT:
В противном случае вы можете построить свой массив многомерным и отсортировать по одному из индексов, например так:

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 голос
/ 23 февраля 2012

Как описано в моем комментарии, 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);

Если вы хотите, чтобы проценты по убыванию инвертировали массив после его сортировки.

$data = array_reverse($data, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...