这是我以前从未遇到过的问题,而且似乎没有相应的函数。
我正试着用键对下面的多维数组进行排序
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,