За последние 24 часа нас посетили 180146 программистов и 3091 робот. Сейчас ищут 1782 программиста ...

Как подсчитать все элементы массива? (рекурсия и goto)

Тема в разделе "PHP для новичков", создана пользователем html-программист, 18 фев 2012.

  1. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Есть, скажем, такой массив:

    Код (Text):
    1. <?php
    2. $a=array(1, 1, 1, 1, 1);
    3. $array=array(1, 8, 3, $a, 2, 18);
    4. $array2=array(5, 3, $array, 2, 1);
    5. echo "<pre>";
    6. print_r($array2);
    7. echo "<pre>";
    8. ?>
    Код (Text):
    1. Array
    2. (
    3.     [0] => 5
    4.     [1] => 3
    5.     [2] => Array
    6.         (
    7.             [0] => 1
    8.             [1] => 8
    9.             [2] => 3
    10.             [3] => Array
    11.                 (
    12.                     [0] => 1
    13.                     [1] => 1
    14.                     [2] => 1
    15.                     [3] => 1
    16.                     [4] => 1
    17.                 )
    18.  
    19.             [4] => 2
    20.             [5] => 18
    21.         )
    22.  
    23.     [3] => 2
    24.     [4] => 1
    25. )
    Ну и, скажем, не создавая функций и не используя count, надо подсчитать все элементы в массиве.

    Я вчера что-то нагородил бестолковое:
    Код (Text):
    1. <?php
    2. $a=array(1, 1, 1, 1, 1);
    3. $array=array(1, 8, 3, $a, 2, 18);
    4. $array2=array(5, 3, $array, 2, 1);
    5. $len=0;
    6. $i=0;
    7. metka1:
    8. if is_null($array2[$i]){
    9.     $array2=$temp;
    10.     $i=tempi+1;
    11.     goto metka2;
    12. } elseif is_array($array2[$i]){
    13.     $temp=$array2;
    14.     $tempi=$i;
    15.     $array2=$array2[$i];
    16.     $i=0;
    17. } else {
    18.     $len++;
    19.     $i++;
    20. }
    21. goto metka1;
    22. metka2:
    23. echo $len;
    24. ?>
    Но не могу дальше сообразить. Например все вложенные массивы и их количество можно записывать в другой массив. Но как потом выйти из этой конструкции? Если количество вложений ==0 goto metka2?
    Голова не работает, выручайте, а то я успокоиться не могу.

    Добавлено спустя 2 минуты 24 секунды:
    У Попова, про goto вообще ничего нет :(
     
  2. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    culcArr($yourArray);

    function calcArr($arr){
    $num =0;
    If (is_array($arr)){
    foreach($arr as $el) $num += calcArr($el);
    } else {
    return 1;
    }
    return $num;
    }


    И это правильно :)
     
  3. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Мне надо рекурсию с помощью goto сделать.
     
  4. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    Блина.. Ну тогда так

    $a=array(1, 1, 1, 1, 1);
    $array=array(1, 8, 3, $a, 2, 18);
    $array2=array(5, 3, $array, 2, 1);

    $num=0;
    $newArr = $array2;
    while(!empty($newArr)){
    foreach($newArr as $k=>$val){
    if (is_array($val)){
    $newArr[] = $val;
    } else {
    $num += 1;
    }
    unset($newArr[$k]);
    }
    }

    Print $num;

    Как-то так. Но без готу :)

    Го ту ф топку :)
    Хотя можно в конце цинично послать прогу к точке, где принт стоит. Помоему это будет самый удачный вариант использования го ту в даном контексте :)
     
  5. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Не, надо только с готами.

    Добавлено спустя 54 секунды:
    С готами и без циклов.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А почему с готами можно а с функциями нельзя? а давайте вобще без пхп. на бат-файлах.
     
  7. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Использовать циклы и функции мне не позволяет моя сугубая религиозность.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    что на пхп с готами, что на бат - алгоритм один и тот же
     
  9. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    Ну оформи то же самое. Только циклы условием замени и гото поставь в конце моих циклов, которые к его началу будут отсылать
     
  10. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    простите, что опять немой вмешивается, а go to - это у Вас от "бейсика" осталось?
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это ультраоптимизация
     
  12. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    Не, это стиль жизни по-моему :)
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    угу.

    это когда не только самолет делают обтекаемым, а еще и воздух полируют.
     
  14. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    С целью защитить код от плагиата разве что
     
  15. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    От него, родимого. "Кассетный Бейсик для ЭВМ \"Поиск\""
     
  16. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ну так этта, добро пожаловать в новый век :)

    я, признаться, то же долго не мог понять, что $this-> что то там, в классе, это означает go to та самая строка в бейсике :)
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это не означает
     
  18. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ты как всегда категоричен :)
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не могу врать друзьям =)
     
  20. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Угу. $this-> в php - то-же самое, что a href в html
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  22. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    не могу согласиться....
     
  23. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Допустим, можно использовать только оператор goto, каким образом тогда можно проверить, что какой-то элемент массива содержит массив? Если использовать только оператор goto и какой-нибудь цикл, тогда, думаю, реально сделать...
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    цикл не нужен. цикл это и есть гото.
     
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Нет, надо делать то же самое, что происходит при рекурсии с помощью функции: у каждой функции свой немспейс, после вызова функция получает копию элемента, который является массивом, поэтому переменные не перекрывают друг друга. Чтобы сделать то же самое в пределах одного неймспейса, надо генерировать имена переменных на лету.
    Код (PHP):
    1. $a=array(1, 1, 1, 1, 1);
    2. $array=array(1, 8, 3, $a, 2, 18);
    3. $array2=array(5, 3, $array, 2, 1);
    4.  
    5. var_dump($array2);
    6.  
    7. $count = 0;
    8. $level = 0;
    9. $vname = 'level'.$level;
    10. $$vname = $array2;
    11. itr:
    12. $current = current($$vname);
    13. if (is_array($current)) {
    14.      $level++;
    15.      $vname = 'level'.$level;
    16.      $$vname = $current;
    17.      goto itr;
    18. } else {
    19.      $count++;
    20. }
    21. nxt:
    22. if (!next($$vname)) {
    23.      if (!$level) {
    24.           goto quit;
    25.      }
    26.      $level--;
    27.      $vname = 'level'.$level;
    28.      if (!next($$vname)) {
    29.           goto nxt;
    30.      }
    31. }
    32. goto itr;
    33. quit:
    34. echo 'Result: '.$count; 
    Код (Text):
    1. array(5) {
    2.   [0]=>
    3.   int(5)
    4.   [1]=>
    5.   int(3)
    6.   [2]=>
    7.   array(6) {
    8.     [0]=>
    9.     int(1)
    10.     [1]=>
    11.     int(8)
    12.     [2]=>
    13.     int(3)
    14.     [3]=>
    15.     array(5) {
    16.       [0]=>
    17.       int(1)
    18.       [1]=>
    19.       int(1)
    20.       [2]=>
    21.       int(1)
    22.       [3]=>
    23.       int(1)
    24.       [4]=>
    25.       int(1)
    26.     }
    27.     [4]=>
    28.     int(2)
    29.     [5]=>
    30.     int(18)
    31.   }
    32.   [3]=>
    33.   int(2)
    34.   [4]=>
    35.   int(1)
    36. }
    37. Result: 14