根据多维数组的关键字对其他数组值进行排序


Sort Multi Dimensional Array by its keys from another arrays values

这是我以前从未遇到过的问题,而且似乎没有相应的函数。

我正试着用键对下面的多维数组进行排序

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
    )
)

最简单的方法是"翻转"定义排序的数组,然后获取与其他数组中键匹配的值:

$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
        )
)

您可以使用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,