2014-05-26 3 views
0

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

Вот пример того, что мой массив может выглядеть ....

$a[0][1][2][3]=4; 
$a[0][11][22]=33; 
$a[0][111]=222; 
$a[0][1][2][3][4][5][6][7]=888; 
$a[0][1][2][3][4][5][6][7][8]=999; 

Но мой реальный массив обыкновение быть обязательно числовым.

Что я хотел бы для вывода следующие значения из приведенного выше примера ...

3,2,1,7 и 8

Может кто-нибудь мне точку в правильном направлении, не требуя рекурсивный вызовы функций или интенсивное использование ЦП?


UPDATE:

Причина, почему я задал этот вопрос, потому что у меня есть большая проблема для решения. Я позаимствовал функцию в Интернете, что на самом деле обрабатывается мой список смежности в массив следующим образом после использования print_r() функция:

Array 
(
[Pint] => Array 
    (
    [Beer] => Array 
     (
     [Parent] => Pint 
     ) 

    [Parent] => 
    ) 

[Into] => Array 
    (
    [Running] => Array 
     (
     [Group] => Array 
      (
      [Girl] => Array 
       (
       [Parent] => Group 
       ) 

      [Guy] => Array 
       (
       [Parent] => Group 
       ) 

      [Parent] => Running 
      ) 

     [Parent] => Into 
     ) 

    [Parent] => 
    ) 

) 

То, что я хочу сделать, это использовать данные в массиве, чтобы сформировать предложение без используя фиксированные числа или имена, поскольку имена и значения массива (отличные от ключевого родителя) изменяются.

Таким образом, в этом массиве, я хочу, чтобы сформировать следующие предложения, используя слова и ходьбу через массив:

Желаемого предложение 1. пинту пива (я добавлю «А» и «из» позже. Пинт и пиво поступают из массива.)

Желаемое предложение 2. Девушка и парень в группе, которая работает во что-то («и», «в» и «что-то» - это слова, которые я добавлю к предложению позже)

Если была функция, подобная foreach, которая начинается с последнего измерения и работает в первом, это может быть полезно. Общей особенностью этих предложений является то, что последнее измерение рассматривается первым, а первое измерение - последним.

У кого-нибудь есть идеи для ответа?

P.S. Я обновил другой код, чтобы сделать массив следующим образом:

Array 
(
[Girl] => Array 
    (
    [Group] => Array 
     (
     [Running] => Array 
      (
      [Into] => 
      ) 

     ) 

    ) 

[Guy] => Array 
    (
    [Group] => Array 
     (
     [Running] => Array 
      (
      [Into] => 
      ) 

     ) 

    ) 

[Beer] => Array 
    (
    [Pint] => 
    ) 

) 
+0

Прежде всего $ a [0] - 1 размер, поэтому $ a [0] [111] будет 2 измерения, а не вашей догадки 1. –

+0

вы правы .... Я забыл это обновить. Я слишком много думал о петле foreach. –

+0

@MikeSt См. Мой обновленный ответ. Рассматривая ваши данные, глубина рекурсии не должна быть проблемой. – mclaassen

ответ

0

Ну Heres рекурсивное решение в любом случае. Он дает оценку того, что имеет самый глубокий размер:

function count_array_dimensions($a, $count) { 
    $max = $count; 
    foreach($a as $e) { 
     if(is_array($e)) { 
      $current = count_array_dimensions($e, $count+1); 
      if($current > $max) { 
       $max = $current; 
      } 
     } 
    } 

    return $max; 
} 

//Usage: 
$a[0][1][2][3][4][5][6][7][8]=999; 

//Initialize with 0 instead of 1 for your counting scheme 
echo count_array_dimensions($a, 1); 
0

Вы по-одному в размерности всех этих массивов. Ваши выходы должны быть 4, 3, 2, 8 и 9. array_walk_recursive - ваш лучший выбор здесь, к сожалению.

+0

OP специально сказал «не требуя рекурсивных вызовов функций» – mclaassen

+0

Я понимаю это.В частности, он или она сказал «не требуя рекурсивных вызовов функций или интенсивного использования ЦП», что заставляет меня думать, что они находятся под ошибочным впечатлением, что такая операция будет интенсивной. Это может быть особенно массивный массив. Единственный способ сделать это без рекурсии - это использовать стек и очередь, и это будет, по крайней мере, одинаково интенсивным. Отсюда мой ответ, что его «лучший выбор» будет заключаться в использовании однострочного массива array_walk_recursive(). array_walk_recursive() не выполняет итерацию по пустым элементам массива, поэтому может и не работать. – Max

+0

Это не один лайнер, они все равно должны действительно подсчитывать размеры с помощью обратного вызова. Я уверен, что мое решение работает без рекурсии и без стека или очереди. – mclaassen

Смежные вопросы