【发布时间】:2019-03-27 10:38:48
【问题描述】:
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。因此循环计数器通过 9 的 50cc 选项大于 100cc 选项。
(为清楚起见,示例输出为):
50cc 选项 1
50cc 选项 2
50cc 选项 3
50cc 选项 4
50cc 选项 5
100cc 选项 1
100cc 选项 2
100cc 选项 3
50cc 选项 6
50cc 选项 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);
【问题讨论】:
-
您可以在 SQL 查询中对它们进行排序吗?
-
@MickaelLeger 它们是单独的 SQL 执行,所以不......虽然现在你提到它,也许我可以将我的 SQL 更改为使用
WHERE IN ($values)- 请稍等! :) -
你能有一个非数字键吗? IE。 “50.3”?
-
@AlexanderDeSousa 这是一个好主意 - 但 JSON 方面似乎不允许“value.counter” - 它返回“值”。作为一个关键:/但很好的想法:)我会尝试使用_或其他东西:)
-
@ThisGuyHasTwoThumbs 没问题,我有一个使用 uksort 的书面解决方案,只要你的密钥能够有某种分隔符,我就可以做到。
标签: php mysql arrays sorting ksort