php - 具有意外输出的 array_multisort
问题描述
我有一个必须处理来自 SQL 查询的响应的函数。我必须将其重新格式化为数组,重新排序并返回新数组。这就是我配置要排序的数组的方式
foreach($response as $key => $codigocentro ){
$centro = Centros::find($codigocentro);//another query using Phormium (this works fine)
$centro[$key]['da']= $centro->da;
$centrosAsignados[$key]['descrip'] = $centro->descrip;
$centrosAsignados[$key]['codigo'] =$codigocentro;
if (condition){
$centrosAsignados[$key]['orden_cs_cl'] = $centro->descrip;
$centrosAsignados[$key]['descrip_cabecera'] =$codigocentro;
}
}
之后,我准备了多重过滤器,如手册https://www.php.net/manual/en/function.array-multisort.php所示 (示例 3)
$array_da = array_column($centrosAsignados, 'da');
$array_cabec = array_column($centrosAsignados, 'descrip_cabecera');
$array_cs_cl = array_column($centrosAsignados, 'orden_cs_cl');
$array_descr = array_column($centrosAsignados, 'descrip');
最后一步:
array_multisort($centrosAsignados,
$array_da, SORT_DESC,
$array_cabec,
$array_cs_cl );
现在,我似乎只对 $array_cabec 有问题,因为“da”或“cs_cl”过滤器按预期工作。输出按照我配置它们的顺序尊重这两个成功条件。
我在之前和之后以多种方式输出了结果,并且在这个特定场景中我已经关闭了我的问题(下图中这些转储的输出)
var_dump($array_cabec ); // to output initial values on this particular array
array_multisort($centrosAsignados, $array_cabec)
$array_cabec2 = array_column($centrosAsignados, 'descrip_cabecera');// reassigning values after sorting
var_dump($array_cabec2 ); // to output final values
我已经检查过类似的问题,例如 array_multisort 无法正常工作?
我已经删除了可能包含特殊字符的条目,并尝试了几种编码解决方案,如 mb_convert_encoding、utf8_encode、utf8_encode+decode、iconv、trim 等。没有结果(最多我丢失了特殊字符,但排序没有区别)
我得到的最接近的是以下
asort($array_cabec);
这实际上对我需要的字段进行了排序,但不是我想要的。
我希望 array_multisort 中的过滤器以特定顺序依次应用。我将向您展示我此时收到的实际输出(我正在使用邮递员):
我期待所有的“CS ALGETE”排在第一位(C 排在 D 之前,所以 DA_NORTE 不应该排在第一位)。我不知道我是否应用了正确的过滤器,我尝试过的标志是否应该以不同的顺序排列,或者 php 中是否有另一个本机函数来实现我所需要的。
对于环境信息,我在 windows 上使用 php7,数据来自的数据库来自 Informix 数据库。如果需要更多信息,请在评论中通知我。减少信息以方便阅读,例如在我没有显示所有 81 个字段的图像中。如果您认为此问题适合标记为重复,请确保它解决了我的问题。
解决方案
经过比预期更多的研究后,我使用USORT而不是 array_multisort 解决了它,我仍然认为它在使用字符串时存在错误。哪些字符串?-我仍然不知道(如果你知道,请发表评论)。
我不再需要 headers 数组。Usort 加上带有回调的匿名函数非常完美。(就像它对asort所做的那样)但我不知道它可以与多维一起使用。
usort($centrosAsignados, function ($a, $b){
$c = $a['da'] - $b['da'];
$c .= strcmp( $a['descrip_cabecera'], $b['descrip_cabecera']);
$c .= $b['orden_cs_cl'] - $a['orden_cs_cl'];
$c .= strcmp( $a['descrip'], $b['descrip']);
return $c;
} );
编辑:您可以用 $b 交易 $a 以获得任何应用过滤器的升序或降序。例如:
$a['da'] - $b['da']; => $b['da'] - $a['da'];
sleipnir214 的抵押贷款
https://www.tek-tips.com/viewthread.cfm?qid=690382
和 Nsisodia91 来自 php 手册中的用户贡献(这个答案有点下面)
推荐阅读
- winapi - 支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 和 OPOS 是否有效?
- flutter - 如何在 Dart 中生成类图?
- firebase - 由于权限问题,无法访问 Firebase 中的 Cloud Firestore
- bash - 为从标准输出生成的 zip 存档中的文件命名
- r - 如何返回最小目标函数对应的列?
- angular - 在哪里存储选定的列表项?
- python - 应用 groupby 后访问 DataFrame 的元素
- python - 如何“交替”显示两个列表的内容?
- docker - 尝试构建可自定义的 docker 映像时出错
- php - 为什么准备好的状态不能正常工作?