我有一个多维数组,我想对它进行排序。该数组如下所示:
$test_arr = [
/* artist albums tracks */
[ "Green Day", "8", "26", ],
[ "Remy Zero", "1", "2", ],
[ "System of a Down", "1", "1", ],
[ "Modern Talking", "1", "1", ],
[ "Snow Patrol", "1", "2", ],
[ "Linkin Park", "6", "18", ],
];
我想根据他们的专辑和曲目数字对艺术家进行排序。为此,我创建了一个函数。
function sort_mul_dim_arr($mul_dim_arr, $sort_col) {
$control_arr = [];
for ($i = 0; $i < count($mul_dim_arr); $i++) {
array_push($control_arr, $mul_dim_arr[$i][$sort_col]);
}
sort($control_arr);
$sorted_arr = [];
for ($i = 0; $i < count($control_arr); $i++) {
for ($j = 0; $j < count($mul_dim_arr); $j++) {
if ($control_arr[$i] == $mul_dim_arr[$j][$sort_col]) {
array_push($sorted_arr, $mul_dim_arr[$j]);
}
}
}
return $sorted_arr;
}
$test_arr = sort_mul_dim_arr($test_arr, 0);
排序后,输出($ test_arr)如下所示:
$test_arr = [
/* artist albums tracks */
[ "Green Day", "8", "26", ],
[ "Linkin Park", "6", "18", ],
[ "Modern Talking", "1", "1", ],
[ "Remy Zero", "1", "2", ],
[ "Snow Patrol", "1", "2", ],
[ "System of a Down", "1", "1", ],
];
但这就是问题所在。如果我用于排序的列具有唯一值,则函数可以正常工作。在示例中,艺术家姓名是唯一的。但是,如果我尝试使用专辑或跟踪列进行排序,则功能不起作用。它弄乱了阵列。行开始出现两次或更多次。
我已经阅读了一些关于排序多维数组的其他问题,但他们讨论的是水平排序。我需要按垂直顺序排序。如何改进此功能,以便我也可以使用非唯一列进行排序?或者已经有PHP功能了吗?
答案 0 :(得分:1)
这应该有一些变化(array_column
需要PHP&gt; = 5.5.0)。按tracks
然后albums
然后artist
排序:
$artist = 0;
$albums = 1;
$tracks = 2;
array_multisort(
array_column($test_arr, $tracks), SORT_DESC,
array_column($test_arr, $albums), SORT_DESC,
array_column($test_arr, $artist), SORT_DESC,
$test_arr
);
这是一个将执行相同操作的函数:
function sort_one_or_other(&$array, $sort1) {
$sort2 = ($sort1 = 1) ? 2 : 1;
array_multisort(
array_column($array, $sort1), SORT_DESC,
array_column($array, $sort2), SORT_DESC,
array_column($array, 0), SORT_DESC,
$array
);
}
sort_one_or_other($test_arr, 2);
print_r($test_arr);
如果您真的只关心一列而其他列未分类,那么:
function sort_by_col(&$array, $sort) {
array_multisort(array_column($array, $sort), SORT_DESC, $array);
}
sort_by_col($test_arr, 2);
print_r($test_arr);
答案 1 :(得分:1)
您可以使用usort(),例如:
<?php
function my_intcmp ($a, $b)
{
$a = intval ($a);
$b = intval ($b);
if ($a == $b) {
return 0;
} else {
return $a < $b ? 1 : -1;
}
}
function my_sort ($a, $b)
{
$comp1 = my_intcmp ($a[1], $b[1]);
if ($comp1) {
return $comp1;
} else {
return my_intcmp ($a[2], $b[2]);
}
}
usort ($test_arr, "my_sort");
print_r ($test_arr);
?>
答案 2 :(得分:0)
您可以尝试以下内容
$artist = array();$albums = array();$tracks = array();$finalArr = array();
foreach($test_arr as $k=>$v){$artist[] = $v[0];$albums[] = $v[1];$tracks[] = $v[2];}
$length = count($albums);
for($i = 0; $i < $length; $i++){
for($j = $i + 1; $j < $length; $j++){
if($albums[$i] < $albums[$j]){
$temp = $albums[$j]; $tA = $artist[$j]; $tT = $tracks[$j];
$albums[$j] = $albums[$i]; $artist[$j] = $artist[$i]; $tracks[$j] = $tracks[$i];
$albums[$i] = $temp; $artist[$i] = $tA; $tracks[$i] = $tT;
}
}
}
foreach($albums as $k=>$v){ $finalArr[] = array('artist'=>$artist[$k], 'albums'=>$albums[$k], 'tracks'=>$tracks[$k]);}
print_r($finalArr);