2016-03-31 7 views
0

Я пытаюсь сделать рекурсивную функцию для подсчета элементов на уровнях массива. Но не может этого сделать уже два часа. Проверьте пример массива:Рекурсивные элементы подсчета многомерного массива

Array ( 
    [0] => Array ( 
     [0] => Array ( 
      [0] => Array () 
      [1] => Array () 
     ) 
     [1] => Array () 
    ) 
    [1] => Array ( 
     [0] => Array (
      [0] => Array (
       [0] => Array () 
       [1] => Array () 
      ) 
     ) 
    ) 
) 

Полученный массив, подсчитывать элементы на разных уровнях будет:

Array ([0] => 2, [1] => 3, [2] => 3, [3] => 2) 

Я сделал функцию для подсчета общего количества элементов массива, но не знаю, как считать каждый «уровень»

function countTotalArr($arr, $lvl) { 
    if ($lvl != 0) $cnt = 1; 
    else $cnt = 0; // don't count zero level 

    for ($i = 0; $i < count($arr); $i++) 
     $cnt += countArr($arr[$i], $lvl + 1); 

    return $cnt; 
} 

$total = countTotalArr($referralsCount, 0); 

ответ

2

Другое решение с использованием while:

// $array is your array at the beginning of iteration 

$depthMap = []; 
$currentDepth = 0; 
while(true) { 
    $depthMap[$currentDepth] = count($array); 

    $carry = []; 
    foreach($array as $item) { 
     if(is_array($item)) { 
      $carry = array_merge($carry, $item); 
     } 
    } 

    if(count($carry) < 1) { 
     break; 
    } 

    $array = $carry; 
    $currentDepth++; 
} 
1

Попробуйте этот код:

<?php 

$array = Array ( 
    0 => Array ( 
     0 => Array ( 
      0 => Array () , 
      1 => Array () , 
     ) , 
     1 => Array () , 
    ) , 
    1 => Array ( 
     0 => Array (
      0 => Array (
       0 => Array (), 
       1 => Array (), 
      ), 
     ), 
    ) , 
); 

function countTotalArr($arr, $lvl) 
{ 
    $result = array(); 
    $countOnLevel = count($arr); 

    $result[$lvl] = $countOnLevel; 

    $tempArray = array(); 
    foreach($arr as $index => $singleArray) 
    { 
     foreach($singleArray as $singleSubArray) 
     if(is_array($singleSubArray)) 
      $tempArray[] = $singleSubArray; 
    } 

    if(!empty($tempArray)) 
    { 
     $levelTemp = $lvl + 1; 
     $result = array_merge($result, countTotalArr($tempArray, $levelTemp)); 
    } 

    return $result; 
} 

$total = countTotalArr($array, 0); 

echo '<pre>'; 
print_r($total); 

Результат print_r($total) является:

Array 
(
    [0] => 2 
    [1] => 3 
    [2] => 3 
    [3] => 2 
)