PHP多维数组排序

发布于 2022-09-11 19:27:14 字数 516 浏览 12 评论 0

给定一个二维数组,如下,请对它的键/值进行排序。注意: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等?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我ぃ本無心為│何有愛 2022-09-18 19:27:14
<?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);
诗化ㄋ丶相逢 2022-09-18 19:27:14
<?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)
  }
}
‖放下 2022-09-18 19:27:14

题主修改了题目,加了限制条件不能使用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手册

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文