За последние 24 часа нас посетили 17764 программиста и 1718 роботов. Сейчас ищут 964 программиста ...

Помогите решить задачу с массивами

Тема в разделе "PHP для новичков", создана пользователем New_neo, 15 ноя 2015.

  1. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Есть массив
    Код (PHP):
    1. $a=[1,[2,[3]]] 
    Нужно написать рекурсивную функцию для поиска суммы массива.
    Код (PHP):
    1. function rsum(array $a){
    2.  $tmp = array();
    3.   foreach($a as $val){
    4.          $tmp[] = $val;
    5.         for($i=0, $sum=0; $i<count($tmp); $i++)
    6.         if($val[$i])
    7.         {
    8.         $sum+=$val[$i];
    9.             
    10.         }
    11.     
    12.     }    
    13.    
    14.    }
    Не могу найти сумму - кто может подскажите чем -нибудь.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а что такое рекурсия знаешь? не в теории, а на практике?

    Добавлено спустя 3 минуты 22 секунды:
    Код (PHP):
    1. function rsum($array) {
    2.     $i = 0;
    3.     foreach($array as $value) {
    4.         if (is_array($value)) {
    5.             $i += rsum($value);
    6.         }
    7.         else {
    8.             $i += $value;
    9.         }
    10.     }
    11.     return $i;
    12. } 
     
  3. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Да знаю!

    Добавлено спустя 5 минут 35 секунд:
    Есть же добрые люди на свете, только вот mat($value); не понимает PHP
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а вот подумать что за место mat должно быть не судьба?
    я уже исправил.
     
  5. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Спасибо огромное! Вы просто мастер! Как я до этого не додумался ? Спасибо все работает!
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    может потому что просто не думал :)
     
  7. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Скажите пожалуйста а без рекурсии возможно решение подобной задачи?
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    По идее можно, любую рекурсию можно развернуть в цикл. Но всё, что мне приходит в голову - это имитировать стек вызовов, что не является полноценным разворачиванием.
     
  9. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    может с помощью while пока i не будет больше массива?
     
  10. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Без рекурсии никак, т.к. нужно обойти вложенные массивы. Но можно делать по-разному
    Код (PHP):
    1. $a = [1, [2, [3, [4, [5, [6, [7]]]]]]];
    2. $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($a));
    3. $sum = array_sum(iterator_to_array($iterator, false)); 
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    там можно создать массив многомерный и в него записывать ссылки (именно ссылки) на массивы и номер итерации на которой остановились и перебирать ссылки, правда это геморройно, у меня нет времени делать такое.

    Код (PHP):
    1. $list[ sizeof($list) ] = array( 'link' => & $array, 'i' => 0 );
    типа если в $array найдется еще массив, он (ссылка на него) будет записан в $list, ну и надо будет пройти по всему $list, как то так.
     
  12. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Буду пробовать, спасибо за совет!
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Код (PHP):
    1. function Sum($array) {
    2.     $sum = 0;
    3.     $list = array();
    4.     $list[ sizeof($list) ] = array( 'link' => & $array );
    5.     for($i = 0; $i < sizeof($list); $i++) {
    6.         for($y = 0; $y < sizeof( $list[$i]['link'] ); $y++) {
    7.             if ( is_array($list[$i]['link'][$y]) ) {
    8.                 $list[ sizeof($list) ] = array( 'link' => & $list[$i]['link'][$y] );
    9.             }
    10.             else {
    11.                 $sum += $list[$i]['link'][$y];
    12.             }
    13.         }
    14.     }
    15.     return $sum;
    16. } 
    вот такой хрень у меня получилось.
     
  14. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Работает! Буду изучать Ваш вариант!
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    VLK, как раз решение с имитацией стека вызовов.
     
  16. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
  17. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (PHP):
    1. $a = [1,[2,[3]],10];
    2. class rsum { public static $sum=0; }
    3. array_walk_recursive($a, function($a){rsum::$sum += $a;} );
    4. echo rsum::$sum;
    Добавлено спустя 1 минуту 38 секунд:
    Код (PHP):
    1. function rsum($a) {
    2.   static $sum=0;
    3.   if (is_array($a)) array_map(__FUNCTION__,$a);
    4.   else $sum += $a;
    5.   return $sum;
    6. }
    7. echo rsum($a); 
     
  18. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Спасибо за ответы! Там такой нюанс - задачу нужно решить без встроенных функций языка PHP.
     
  19. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (PHP):
    1. function rsum(Array $a) { // без встроенных функций и без рекурсии
    2.   $sum=0;
    3.   while(sizeof($a)>0) {
    4.     foreach($a as $k=>$v) {
    5.       if (is_array($v)) {
    6.         foreach($v as $vv) $a[]=$vv;
    7.       } else {
    8.        $sum += $v;
    9.       }
    10.       unset($a[$k]);
    11.     }
    12.   }
    13.   return $sum;
    14. }
    15. echo rsum( [ 1,[2,[3]],[4] ] ); // 10          
     
  20. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Класс! Подскажите пожалуйста $a as $k=>$v и $a[]=$vv; че делает?
     
  21. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  22. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Ну где-то так, все на самостоятельное обучение. Я так понял $a[]=$vv; - это добавить элемент в конец массива.

    Добавлено спустя 9 минут 49 секунд:
    Задачу можно решить еще таким способом:
    Код (PHP):
    1. function rsumx(array $a)
    2. {
    3.   $current=[$a];
    4.   $s=0;
    5.   while(count($current))
    6.   {
    7.     $a_new=[];
    8.     foreach($current as $item)
    9.     {
    10.       if(is_array($item))
    11.       {
    12.         foreach($item as $v)
    13.           $new[]=$v;
    14.       }
    15.       else
    16.         $s+=$item;
    17.     }
    18.     $current=$new;
    19.   }
    20.   return $s;
    21. } 
    Добавлено спустя 2 минуты 31 секунду:
    Всем большое спасибо!

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  23. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    от моего отличается только наличием временного массива $new.