搜索

首页  >  问答  >  正文

php - 一个N维数组,求每一维度的元素个数(每一维度的每个元素可能是数组或者标量)

没有代码有思路也可以
例如
$earth = array(

'asia'=>array(
    'china'=>array(
        'beijing',
        'shanghai',
        'tianjin',
        'hangzhou'
    ),
    'japan'=>array(
        'tokyo',
        'hokkaido',
        'nagasaki'
    )
),
'europe'=>array(
    'france'=>array(
        'paris',
        'lyon'
    ),
    'spain'=>array(
        'madrid',
        'barcelona',
        'sevilla'
    )
),
'australia'=>array(
    'australia'=>array(
        'sydney',
        'melbourne'
    )
)

);
返回 3,5,14

PHP中文网PHP中文网2817 天前254

全部回复(4)我来回复

  • 大家讲道理

    大家讲道理2017-04-10 16:37:15

    我觉得你要做这种统计的话,应该只能用递归的方式了

    // $array:要统计的数组,$i为第几维,$count维上层统计
    function count_array($array,$i=1,$count = array()) {
        $n = 0;
        if(isset($count[$i])) {
            $n = $count[$i];
        }
        $count[$i] = count($array) + $n;
        $i += 1;
        foreach($array as $item) {
            if(is_array($item)) {
                $count = sp_arr($item,$i,$count);
            }
        }
        return $count;
    }
    $array = array(
        'a' => array(
            'b' => 'c',
            'd' => 'e',
            'f' => 'g',
        ),
        'h' => array(
            'i' => array(
                'j' => 'k',
                'l' => 'm',
                'n' => array(
                    'o' => 'p',
                    'q' => 'r'
                )
            )
        )
    );
    $count = count_array($array);
    var_dump($count); 
    // result:
    /**
     *array (size=4)
     *  1 => int 2
     *  2 => int 4
     *  3 => int 3
     *  4 => int 2
     */

    回复
    0
  • 迷茫

    迷茫2017-04-10 16:37:15

    好吧,我写个循环的(可优化,自行优化,因为我对PHP不是很熟)
    简单来说是一个广度优先搜索(稍微优化一下的队列,如果改成栈就是深度优先)

    function count_array($array) 
    {
        $count = array();
        $level = 0;
        
        $tfifo = $array;    
        do{
        $fifo = $tfifo;
        $tfifo = array();
        $count[$level] = 0;
        foreach($fifo as $item){
            $count[$level]++;
            if(is_array($item)) {
                foreach($item as $subitem){
                $tfifo[] = $subitem;
            }
            }
        }
        $level++;
        }while(count($tfifo)>0);
        return $count;
    }
    

    回复
    0
  • 迷茫

    迷茫2017-04-10 16:37:15

    arr{x}{y}[z]
    第三维度的元素个数不就是arr{x}{y}.length么?
    依次类推不就行了?
    还是说我对你的问题理解上有错误?

    用中括号刚前面的没出来,,,

    回复
    0
  • 阿神

    阿神2017-04-10 16:37:15

    $num = array() ;
        function get_num($fat,$num){
            $num[] = count($fat) ;
            $sun = array() ;
            foreach ($fat as $key => $value) {
                if (is_array($value)) {
                    foreach ($value as $k => $v) {
                        $sun[] = $v ;
                    }
                }
            }
    
            if ($sun) {
                return get_num($sun,$num) ;
            }
    
            return $num ;
    }
    
    // var_dump(get_num($arr,$fat)) ;
    大神解答,发出来给大家分享一下

    回复
    0
  • 取消回复