按垂直顺序对多维数组进行排序

时间:2014-08-13 17:31:48

标签: php sorting multidimensional-array

我有一个多维数组,我想对它进行排序。该数组如下所示:

$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功能了吗?

PHP Example

3 个答案:

答案 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);