Есть массив Код (PHP): $a=[1,[2,[3]]] Нужно написать рекурсивную функцию для поиска суммы массива. Код (PHP): function rsum(array $a){ $tmp = array(); foreach($a as $val){ $tmp[] = $val; for($i=0, $sum=0; $i<count($tmp); $i++) if($val[$i]) { $sum+=$val[$i]; } } } Не могу найти сумму - кто может подскажите чем -нибудь. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
а что такое рекурсия знаешь? не в теории, а на практике? Добавлено спустя 3 минуты 22 секунды: Код (PHP): function rsum($array) { $i = 0; foreach($array as $value) { if (is_array($value)) { $i += rsum($value); } else { $i += $value; } } return $i; }
Да знаю! Добавлено спустя 5 минут 35 секунд: Есть же добрые люди на свете, только вот mat($value); не понимает PHP
По идее можно, любую рекурсию можно развернуть в цикл. Но всё, что мне приходит в голову - это имитировать стек вызовов, что не является полноценным разворачиванием.
Без рекурсии никак, т.к. нужно обойти вложенные массивы. Но можно делать по-разному Код (PHP): $a = [1, [2, [3, [4, [5, [6, [7]]]]]]]; $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($a)); $sum = array_sum(iterator_to_array($iterator, false));
там можно создать массив многомерный и в него записывать ссылки (именно ссылки) на массивы и номер итерации на которой остановились и перебирать ссылки, правда это геморройно, у меня нет времени делать такое. Код (PHP): $list[ sizeof($list) ] = array( 'link' => & $array, 'i' => 0 ); типа если в $array найдется еще массив, он (ссылка на него) будет записан в $list, ну и надо будет пройти по всему $list, как то так.
Код (PHP): function Sum($array) { $sum = 0; $list = array(); $list[ sizeof($list) ] = array( 'link' => & $array ); for($i = 0; $i < sizeof($list); $i++) { for($y = 0; $y < sizeof( $list[$i]['link'] ); $y++) { if ( is_array($list[$i]['link'][$y]) ) { $list[ sizeof($list) ] = array( 'link' => & $list[$i]['link'][$y] ); } else { $sum += $list[$i]['link'][$y]; } } } return $sum; } вот такой хрень у меня получилось.
Код (PHP): $a = [1,[2,[3]],10]; class rsum { public static $sum=0; } array_walk_recursive($a, function($a){rsum::$sum += $a;} ); echo rsum::$sum; Добавлено спустя 1 минуту 38 секунд: Код (PHP): function rsum($a) { static $sum=0; if (is_array($a)) array_map(__FUNCTION__,$a); else $sum += $a; return $sum; } echo rsum($a);
Код (PHP): function rsum(Array $a) { // без встроенных функций и без рекурсии $sum=0; while(sizeof($a)>0) { foreach($a as $k=>$v) { if (is_array($v)) { foreach($v as $vv) $a[]=$vv; } else { $sum += $v; } unset($a[$k]); } } return $sum; } echo rsum( [ 1,[2,[3]],[4] ] ); // 10
New_neo, а там где вы учитесь, задания дают, а язык не объясняют, что-ли? https://secure.php.net/manual/ru/control-structures.foreach.php, https://php.net/manual/ru/language.types.array.php#language ... .modifying
Ну где-то так, все на самостоятельное обучение. Я так понял $a[]=$vv; - это добавить элемент в конец массива. Добавлено спустя 9 минут 49 секунд: Задачу можно решить еще таким способом: Код (PHP): function rsumx(array $a) { $current=[$a]; $s=0; while(count($current)) { $a_new=[]; foreach($current as $item) { if(is_array($item)) { foreach($item as $v) $new[]=$v; } else $s+=$item; } $current=$new; } return $s; } Добавлено спустя 2 минуты 31 секунду: Всем большое спасибо! PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]