首页 > 解决方案 > 具有意外输出的 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 无法正常工作?

在 PHP 中对具有特殊字符的数组进行排序

如何对 UTF-8 字符串数组进行排序?

我已经删除了可能包含特殊字符的条目,并尝试了几种编码解决方案,如 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 个字段的图像中。如果您认为此问题适合标记为重复,请确保它解决了我的问题。

标签: php

解决方案


经过比预期更多的研究后,我使用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 手册中的用户贡献(这个答案有点下面)

https://www.php.net/manual/en/function.usort.php


推荐阅读