多维数组,新手

求这个多维数组中最小的值,输出空白界面,看半天了也
不知道哪里有问题。$nc 是内层 nnc内内层
clipboard.png

<?php
$arr1=array( 5,
            array(3,5,6,7,8),
            array(13,5,6,17,28),
            array(31,5,76,7,38),
            array(33,55,6,7,
                  array(
            1,70,88
        )));
$min=$arr1[0] [0];
$len=count($arr1);
for($i=0;$i<$len;++$i) {
    $len2 = count($arr1[$i]);
    if (is_array($arr1[$i])) {
        for ($nc = 0; $nc < $len2; ++$nc) {
            if ($arr1[$i][$nc] < $min) {
                $min = $arr1[$i][$nc];
            }
            if (is_array($arr1[$i][$nc])) {
                $len3 = count($arr1[$i][$nc]);
                for ($nnc = 0; $nnc < $len3; ++$nnc) {
                    if ($arr1[$i][$nc][$nnc] < $min) {
                        $min = $arr1[$i][$nc][$nnc];
                    }
                }

            }
        }
    }
    elseif($arr1[$i]<$min){
        $min=$arr1[$i];
    }
}
echo $min;
?>
阅读 2k
2 个回答

大概看了你的代码,局限性比较高。给定的数组只知道是多位数组,压根不知道到底是多少维的。所以你这个for的数量就存在局限性。

你这需求可以借助function来解决。

贴个代码,已经在里面注释了。不懂再评论哈

<?php
$array = [
    5,
    [3,4],
    [5,6],
    [7,8,
        [5,
            [0,
                [-1,2]
            ]
        ]
    ],
    -66,
    [-77,0]
];



function arrayMin($array) {
    //判断数组是否是一维数组,是的话,直接用min函数取得最小值
    if (count($array) == count($array, 1)) {
        return min($array);
    } else {
        //多位数组,用foreach循环数组
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                //判断是否为数组,是的话,重新调用本函数(这样就不用考虑最初给定的$array到底是多少维的了)
                $array[$key] = arrayMin($array[$key]);//直接返回最小值,方便后续的计算
            }
        }
        return min($array);//经过上面的循环计算,$array已经只是个一维数组了
    }
}

var_dump(arrayMin($array));

首先你这种写法很丑, 而且一旦数据结构发生变化, 你的代码就不能用了.
其次, 你的写法有可能会出现错误的, 比如$len2 = count($arr1[$i]);这一句

提几个建议:

  • 使用foreach代替for
  • 使用官方方法代替自己写的方法, 比如官方就提供了min方法

以下是我的示例:

/**
 * @param array $array
 * @return Generator
 */
function flatten_array(array $array): Generator {
    foreach ($array as $member) {
        if (is_array($member)) {
            yield from flatten_array($member);
        } else {
            yield $member;
        }
    }
}

/**
 * @param array $numbers
 * @return int
 */
function find_min_number(array $numbers): int {
    return min(...flatten_array($numbers));
}

echo find_min_number(array(5,
    array( 3, 5, 6, 7, 8 ),
    array( 13, 5, 6, 17, 28 ),
    array( 31, 5, 76, 7, 38 ),
    array( 33, 55, 6, 7,
        array( 1, 70, 88 )
    )
));
推荐问题