TL; DR
Сортировать / группировать массив по ключу без добавления другого уровня в массив (данные, анализируемые плагином jQuery)?
Подробности
Я строю массив для возврата к некоторому элементу <select>
DOM.
Он принимает CC (размер двигателя) в качестве параметра и использует его в качестве ключа, проблемазаключается в сортировке массива после.
Допустим, пользователь выбирает этот диапазон CC:
50, 100, 125
50 имеет 32 доступных варианта
100 имеет 3 доступные опции
125 имеет 12 доступных параметров
Мой текущий код проходит по циклу CC, выполняет SQL для получения параметров и использует счетчик цикла создаетключ, подобный следующему:
$options[$cc. $id] = $someValue;
Это работает так, как вы и ожидаете, однако мой вывод показывает результаты не в том порядке, в котором я нуждаюсь (CC ASC
- поэтому все 50 должны показываться первыми, вместе).
Проблема в том, что
50 с 32 повышается до 5031
в качестве ключа.100 с 3 поднимается до 1002
в качестве ключа.125 с 12 поднимается до 12511
в качестве ключа.
К настоящему времени, мы надеемся, вы сможете ясно увидеть проблему.5031 больше, чем 1002. Таким образом, опции для 50cc с переданным счетчиком цикла 9 больше, чем 100cc.
(просто для ясности, пример вывода):
50cc Вариант 150cc Вариант 250cc Вариант 350cc Вариант 450cc Вариант 5100cc Вариант 1Вариант 100cc 2Вариант 3 100cc50cc Вариант 650cc Опция 7
Возможно, первоначальная проблема заключается в том, как я создаю ключи, но я пытался использовать ksort
с несколькими различными флагами, чтобы попытаться достичь своей цели, но ни один изфлаги, похоже, нацелены на то, что я ищу:
SORT_REGULAR - compare items normally (don't change types)
SORT_NUMERIC - compare items numerically
SORT_STRING - compare items as strings
SORT_LOCALE_STRING - compare items as strings, based on the current locale. It uses the locale, which can be changed using setlocale()
SORT_NATURAL - compare items as strings using "natural ordering" like natsort()
SORT_FLAG_CASE - can be combined (bitwise OR) with SORT_STRING or SORT_NATURAL to sort strings case-insensitively
Как отсортировать / сгруппировать ключи без добавления другого уровня в мой массив (данные анализируются с помощью плагина jQuery, которыйнужны данные в определенном формате)?
РЕДАКТИРОВАТЬ: полный сценарий
<?php
if (strpos(PHP_OS, 'Linux') > -1) {
require_once $_SERVER['DOCUMENT_ROOT']. '/app/connect.php';
} else {
require_once getcwd(). '\\..\\..\\..\\..\\app\\connect.php';
}
$make = $_POST['make'];
$cc = $_POST['cc'];
$sql = 'SELECT * FROM `table`
WHERE `UKM_CCM` = :cc
AND `UKM_Make` = :make
ORDER BY `UKM_Model`, `UKM_StreetName`, `Year` ASC;';
$options = array();
foreach ($cc as $k => $value)
{
$res = $handler->prepare($sql);
$res->execute(array(':cc' => $value, ':make' => $make));
$data = $res->fetchAll(PDO::FETCH_ASSOC);
$i = 0;
if (count($data) > 0) {
foreach ($data as $result)
{
$arrayKey = sprintf('%03d%02d', $cc, $i);
$epid = $result['ePID'];
$make = $result['UKM_Make'];
$model = $result['UKM_Model'];
$cc = $result['UKM_CCM'];
$year = $result['Year'];
$sub = $result['UKM_Submodel'];
$street = $result['UKM_StreetName'];
$options[$arrayKey]['name'] = $make. ' ' .$model. ' ' .$cc. ' ' .$year. ' ' .$sub. ' ' .$street;
$options[$arrayKey]['value'] = $epid;
$options[$arrayKey]['checked'] = false;
$options[$arrayKey]['attributes']['data-epid'] = $epid;
$options[$arrayKey]['attributes']['data-make'] = $make;
$options[$arrayKey]['attributes']['data-model'] = $model;
$options[$arrayKey]['attributes']['data-cc'] = $cc;
$options[$arrayKey]['attributes']['data-year'] = $year;
$options[$arrayKey]['attributes']['data-sub'] = $sub;
$options[$arrayKey]['attributes']['data-street'] = $street;
$i++;
}
}
}
ksort($options, SORT_STRING);
echo json_encode($options);