php查看数组维度的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/** * 返回数组的维度 * @param [type] $arr [description] * @return [type] [description] */ function arrayLevel($arr){ //建立一个存放维度的数组,默认值是1 $al = array(0); function aL($arr,&$al,$level=0){ if(is_array($arr)){ //如果是数组,则+1 $level++; //将当前维度放进数组 $al[] = $level; //循环参数数组,判断数组的元素是否是数组 foreach($arr as $v){ //递归执行本函数,php递归的最大限制是100-200之间。 aL($v,$al,$level); } } } aL($arr,$al); return max($al); } 我们通过一个数组的来分析一下函数的运行轨迹。 |
1 2 3 4 5 |
$a = array( array("a",array("b","c")), "d", array("e","f",array("g","h")) ); |
这个变量,使用函数判断维度的时候,第一次运行,$al 的值是{}空值。
然后进入aL函数,放入3个参数,1、数组$a 2、数组$al的变量引用 3、当前的维度
然后aL函数运行,判断$a是一个数组,这时$level + 1,并且将$level的值1放入数组$al,$al的值为{0,1}
将原始数组$a循环:
第一层第一次循环得到的$v值是:array(“a”,array(“b”,”c”))
然后递归运行aL函数,这时放入的3个参数值是:1、数组是$v 2、数组$al的值1【即引用的变量目前的值】 3、$level的值 1
第二层循环得到的结果是 $level +1 = 2,$al的值为$al{0,1,2}。然后循环数组$v{值=array(“a”,array(“b”,”c”))},递归执行aL函数。
这次执行aL函数的3个参数值是:$v= array(“b”,”c”) ,$al={0,1,2},$level=2 结果是:$level +1 = 3,$al的值为$al{0,1,2,3},这时递归aL函数,因为$v中没有数组,则跳出递归,进行初始数组的第二个值的循环。
第一层第二次循环得到的$v值是:”d”,函数aL运行后,所有变量的值并未变化。包括level和al的值都没有变。
第一层第三次循环得到的$v值是:array(“e”,”f”,array(“g”,”h”),其余两个参数的值 $al={0,1,2},这时$level = 2。因为在递归函数中,变量的变化类似剥洋葱一样,不过从里往外。。
下面是一个例子:
1 2 3 4 5 6 7 8 9 |
function test($a=0,&$result=array()){ $a++; if ($a<10) { $result[]=$a; test($a,$result); } echo $a; return $result; } |
上面的例子非常简单,以a<10作为判断条件,条件成立,则把$a赋给result[];将result的引用传入函数,会将每一次递归产生的a添加到结果数组result。因而本例生成的$result数组是 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 ) 。
本例比较有意思的是echo a的值。相信很多人认为是12345678910吧,其实不然,是1098765432。为什么呢?因为函数还没执行echo $a前就进行了下一次的函数递归。真正执行echo $a是当a<10条件不满足的时候,echo $a,返回result,对于上一层而言,执行完递归函数,开始执行本层的echo $a,依次类推。
以上例子摘自互联网。我们了解了以上知识后,可以改造一下计算数组维度的函数:
改造后的统计数组维度的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function aLs($arr,$level=0){ //建立一个存放维度的数组,内容是0 static $al = array(0); if(is_array($arr)){ //如果是数组,则+1 $level++; //将当前维度放进数组 array_push($al,$level); //循环参数数组,判断数组的元素是否是数组 foreach($arr as $v){ //递归执行本函数,php递归的最大限制是100-200之间。 aLs($v,$level); } } return max($al); } |
噢!评论已关闭。