PHP多维数组排序

给定一个二维数组,如下,请对它的键/值进行排序。注意:5, 2, 7对应的值里的数组不确定的,会很大

eg:

$arr = [
    5 => [1, 4, 8, 98, 3, 33, 17, 76, 63],
    2 => [3, 12, 5, 88, 101, 32, 22, 77, 1],
    7 => [5, 6, 90, 31, 22, 21, 88, 36, 102]
];

排序之后的数组为:

$arr = [
    2 => [1, 3, 5, 12, 22, 32, 77, 88, 101],
    5 => [1, 3, 4, 8, 17, 33, 63, 76, 98],
    7 => [5, 6, 21, 22, 31, 36, 88, 90, 102],
];

请问如何实现排序算法,不允许使用php自带的函数,如sort、ksort等?

阅读 3.5k
3 个回答

题主修改了题目,加了限制条件不能使用php内置排序函数

// 先实现一个排序算法,这里用最简单的冒泡排序
function bubbleSort($arr)
{
    for ($i = 0; $i < count($arr); $i++) {
        for ($j = 0; $j <count($arr) - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $tmp;
            }
        }
    }
    return $arr;
}
// 然后实现对题干数组的排序
function sortArr($arr) {
    // 用实现好的冒泡排序对内层数组进行排序
    foreach ($arr as &$item) {
        $item = bubbleSort($item);
    }
    $keys = array_keys($arr);
    // 对外层数组的key进行排序
    $keys = bubbleSort($keys);
    $sortedArr = [];
    // 根据排序号的key重组数组
    foreach ($keys as $key) {
        $sortedArr[$key] = $arr[$key];
    }
    return $sortedArr;
}

// usage
$sorted = sortArr($arr);

原答案:

function sortArr($arr) {
    // 先对内层元素进行排序
    foreach($arr as $key => $items) {
        sort($items);
        $arr[$key] = $items;
    }
    // 对外层元素进行排序
    ksort($arr);
    return $arr;
}

php自带很多排序函数,回答中用到的ksort排序后会保持索引联系,而sort函数会重置索引,相关排序函数的详细信息可以查看php手册

<?php
$arr = [
    5 => [1, 4, 8, 98, 3, 33, 17, 76, 63],
    2 => [3, 12, 5, 88, 101, 32, 22, 77, 1],
    7 => [5, 6, 90, 31, 22, 21, 88, 36, 102]
];

ksort($arr);
$result  = array_map(function($item){
    sort($item);
    return $item;
},$arr);
var_dump($result);

结果

array(3) {
  [2]=>
  array(9) {
    [0]=>
    int(1)
    [1]=>
    int(3)
    [2]=>
    int(5)
    [3]=>
    int(12)
    [4]=>
    int(22)
    [5]=>
    int(32)
    [6]=>
    int(77)
    [7]=>
    int(88)
    [8]=>
    int(101)
  }
  [5]=>
  array(9) {
    [0]=>
    int(1)
    [1]=>
    int(3)
    [2]=>
    int(4)
    [3]=>
    int(8)
    [4]=>
    int(17)
    [5]=>
    int(33)
    [6]=>
    int(63)
    [7]=>
    int(76)
    [8]=>
    int(98)
  }
  [7]=>
  array(9) {
    [0]=>
    int(5)
    [1]=>
    int(6)
    [2]=>
    int(21)
    [3]=>
    int(22)
    [4]=>
    int(31)
    [5]=>
    int(36)
    [6]=>
    int(88)
    [7]=>
    int(90)
    [8]=>
    int(102)
  }
}
<?php
function m($arr)
{
    $c = count($arr);
    $n = $c - 1;
    if($c <= 1)
    {
        return $arr;
    }
    for($i=0;$i<$c;$i++)
    {
        for($j=0;$j<$n;$j++)
        {
            if($arr[$j] > $arr[$j+1])
            {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;            
            }
        }
    }
    
    return $arr;
}

$s_arr = [
    5 => [1, 4, 8, 98, 3, 33, 17, 76, 63],
    2 => [3, 12, 5, 88, 101, 32, 22, 77, 1],
    7 => [5, 6, 90, 31, 22, 21, 88, 36, 102]
];

foreach($s_arr as $k=>$v)
{
    $new[] = $k;
}
$_new = m($new);

foreach($_new as  $val)
{
    $n_arr[$val] = $s_arr[$val];
}

foreach($n_arr as $keys => $vals)
{
    $res[$keys] = m($vals);
}

print_r($res);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题