通过其他数组值的键对多维数组进行排序

时间:2014-10-07 17:00:29

标签: php arrays

这是我之前没有遇到的问题,似乎没有这方面的功能。

我正在尝试按键

对以下多维数组进行排序
Array (
    [hiphop] => Array (
        [0] => 2123
        [1] => 5683
        [2] => 2345
        [3] => 4567
    )
    [rnb] => Array (
        [0] => 2123
        [1] => 5683
        [2] => 2345
        [3] => 4567
    )
    [dubstep] => Array ( )
    [reggae] => Array ( )
    [trap] => Array ( )
)

从此数组值

Array (
    [0] => hiphop
    [1] => dubstep
    [2] => reggae
    [3] => trap
    [4] => rnb
    [5] => rnb
) 

之前是否有人尝试过此操作或知道解决方法?

由于我是多维数组的新手,所以解释会很棒

如果你能提供帮助,请提前多多谢谢!

最终输出将匹配来自非多维数组的值组织,如此

Array (
    [hiphop] => Array (
        [0] => 2123
        [1] => 5683
        [2] => 2345
        [3] => 4567
    )
    [dubstep] => Array ( )
    [reggae] => Array ( )
    [trap] => Array ( )
    [rnb] => Array (
        [0] => 2123
        [1] => 5683
        [2] => 2345
        [3] => 4567
    )
)

2 个答案:

答案 0 :(得分:2)

您可以使用uksort,这样您就可以根据用户提供的比较功能按键排序。使用该功能,您可以自己创建一个功能,这样您就可以轻松地隐藏复杂的功能。

例如,你想要一个像ksort这样的函数,只需要指定一个外部数组的键,所以这样的函数可能如下所示:

bool ksort_ext(&$array, $keys)

对于实现,您可以包装uksort,如下所示:

function ksort_ext(&$array, $keys)
{
    return uksort($array, function($a, $b) use ($keys) {
            // Result of callback is based on the position of $a and $b in $keys
            return array_search($a, $keys) - array_search($b, $keys);
        });
}

然后,您可以像调用其他排序函数一样调用它,只需将外部数组键作为第二个参数。

$array1 = array(
    'hiphop' => array(1,2,3),
    'rnb' => array(1,2,3),
    'dubstep' => array(1,2,3),
    'reggae' => array(1,2,3),
    'trap' => array(1,2,3));

$array2 = array('hiphop', 'dubstep', 'reggae', 'trap', 'rnb');

var_dump(ksort_ext($array1, $array2)); // Should return true
var_dump($array1); // Should display the ordered array,

答案 1 :(得分:2)

最简单的方法是"翻转"数组定义排序 - 然后获取与另一个数组中 new 键匹配的值:

$s = array ("hiphop","dubstep","reggae","trap","rnb");
$target = array_flip($s);

foreach($target AS $key => &$value){
  $value = $array_containing_unsorted_values[$key];
}

注意:如果在排序数组中出现两次相同的值,则不起作用 - 但是永远不会发生,因为排序定义没有。

在每次排序比较中,应该比使用array_search 2次更快。

结果:

Array
(
    [hiphop] => Array
        (
            [0] => 2123
            [1] => 5683
            [2] => 2345
            [3] => 4567
        )

    [dubstep] => Array
        (
        )

    [reggae] => Array
        (
        )

    [trap] => Array
        (
        )

    [rnb] => Array
        (
            [0] => 2123
            [1] => 5683
            [2] => 2345
            [3] => 4567
        )

)