三维排序字符串数组PHP

时间:2016-03-18 14:39:24

标签: php arrays sorting

我试图订购这个多维数组,但没有成功。我需要按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很快!感谢答案的家伙以及所有帮助过的人!

2 个答案:

答案 0 :(得分:0)

通过引用使用主数组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' );
}

demo

PS:感谢@deceze之前的编辑(在这里维护)。

答案 1 :(得分:-1)

您可以使用此答案中的aasort: Sort Multi-dimensional Array by Value 并将其应用于每个数组行:

1. A List that contain Node name
2. A Forcelayout graph with Node and Link