三维排序字符串数组 PHP


Tridimensional sort string array PHP

我正在尝试对这个多维数组进行排序,但没有成功。我需要按pub_obs升序排序,但保持主数组顺序(AC、BA、..)。主数组(0、1、2、..)内的索引可以更改,但pub_id必须相同。

Array(
    [AC] => Array
        (
            [0] => Array
                (
                    [pub_id] => 1
                    [pub_obs] => c
                )
            [1] => Array
                (
                    [pub_id] => 3
                    [pub_obs] => a
                )
            [2] => Array
                (
                    [pub_id] => 4
                    [pub_obs] => c
                )
        )
    [BA] => Array
        (
            [0] => Array
                (
                    [pub_id] => 1
                    [pub_obs] => b
                )
            [1] => Array
                (
                    [pub_id] => 2
                    [pub_obs] => b
                )
            [2] => Array
                (
                    [pub_id] => 7
                    [pub_obs] => a
                )
        )
)

有人可以帮忙吗?谢谢!

编辑

我忘了说PHP版本5.2,但@fusion3k很快! 谢谢你的回答,伙计和所有帮助过的人!

通过引用使用带有主数组的foreach,然后在每一行前面usort

foreach( $array as &$row )
{
    usort
    (
        $row,
        function( $a, $b )
        {
            return strcmp($a['pub_obs'], $b['pub_obs']);
        }
    );
}

输出:

Array
(
    [AC] => Array
        (
            [0] => Array
                (
                    [pub_id] => 3
                    [pub_obs] => a
                )
            [1] => Array
                (
                    [pub_id] => 4
                    [pub_obs] => c
                )
            [2] => Array
                (
                    [pub_id] => 1
                    [pub_obs] => c
                )
        )
    [BA] => Array
        (
            [0] => Array
                (
                    [pub_id] => 7
                    [pub_obs] => a
                )
            [1] => Array
                (
                    [pub_id] => 2
                    [pub_obs] => b
                )
            [2] => Array
                (
                    [pub_id] => 1
                    [pub_obs] => b
                )
        )
)

使用 foreach 中的引用,usort函数直接作用于主数组,然后在自定义函数中比较pub_id键以定义嵌套排序顺序。

编辑:

上述方法按照问题中的要求有效。但是,如果我们有一个像这样的子数组:

[
    [ 'pub_id' => 1, 'pub_obs' => 'b' ],
    [ 'pub_id' => 2, 'pub_obs' => 'b' ],
    [ 'pub_id' => 3, 'pub_obs' => 'a' ]
]

输出为:

Array
(
    [0] => Array
        (
            [pub_id] => 3
            [pub_obs] => a
        )
    [1] => Array
        (
            [pub_id] => 2
            [pub_obs] => b
        )
    [2] => Array
        (
            [pub_id] => 1
            [pub_obs] => b
        )
)

请求的键已正确排序,但在同一pub_obs值上pub_id顺序不会保持。

为了避免这种情况,您甚至必须对pub_id键进行子处理:

    usort
    (
        $row,
        function( $a, $b )
        {
            $mainCmp = strcmp( $a['pub_obs'], $b['pub_obs'] );
            if( !$mainCmp )
            {
                return( strcmp( $a['pub_id'], $b['pub_id'] ) );
            }
            else return $mainCmp;
        }
    );

在 PHP <5.3 中使用此解决方案

只需定义一个与上述匿名函数内容相同的自定义函数:

function myCompare( $a, $b )
{
    $mainCmp = strcmp( $a['pub_obs'], $b['pub_obs'] );
    if( !$mainCmp )
    {
        return( strcmp( $a['pub_id'], $b['pub_id'] ) );
    }
    else 
    return $mainCmp;
}

然后在foreach()循环中调用它:

foreach( $array as &$row )
{
    usort( $row, 'myCompare' );
}

演示


  • 查看更多关于 usort() 的信息

PS:感谢您@deceze之前的编辑(在此处维护)。

您可以使用此答案中的 aasort:按值对多维数组进行排序并将其应用于每个数组行:

function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}
 //Now your array
 foreach($array as $key => &$value){
   aasort($value,"pub_obs");
 }