2012-02-14 2 views
1

Я всегда ненавидел рекурсию, потому что мой ум не может справиться с бесконечными циклами, и я не могу найти способ правильно подумать об этом. Я пытаюсь понять, как печатать массив значений, используя его. Я хочу, чтобы скомпилировать результат в строку и вернуть его и использовать   в космос он правильно:Рекурсия = страшно! (Codeigniter PHP)

var $count=0; 
    static $formatted=''; 
    function Process_Array($array) 
    { 
    global $count,$formatted; 

    $count++; //this variable is for calculating tab space 

    if(is_array($array) === true) 
    { 
     foreach($array as $key => $value) 
     { 
     echo "<br /><br />Value=";print_r($value); 

     if(is_array($value) === true) 
     { 
      $this->Process_Array($value); 
     } 
     else 
     { 
      //Calculate tab spacing (level in tree). 
      for($i = 1 ; $i < $count ; $i++) 
      $formatted.="&nbsp;&nbsp;"; 

      $formatted.=$value."<br />"; 
     } 
     } 
    } 
    $count--; 
    $final=$formatted; 
    $formatted=''; 
    return $final; 
    } 

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

+3

Поделитесь примером ввода и желаемого вывода. –

+0

рекурсия (n). 1. см. Рекурсию. –

+0

Боковое примечание: вы знаете, что 'globals' плохие? Кстати какая версия PHP вы используете? – PeeHaa

ответ

1

Одна из интересных особенностей функциональных языков (Haskell, OCaml) в отличие от {} языков заключается в том, что вы не получаете циклы. Итерация выполняется с рекурсией. Поэтому мне кажется смешным иметь петли foreach в рекурсивной функции. Почему бы просто не использовать циклы для всего?

Рекурсия требует базового футляра и рекурсивного шага. Если вы печатаете массив, хорошим базовым случаем может быть проверка наличия пустого массива и возврат. После этого рекурсивный шаг вытеснит первый элемент и распечатает его.

function printArray($array) 
{ 
    //base case 
    if(empty($array)) { 
     return; 
    } 

    print_r(array_pop($array)); 

    //recursive step 
    return printArray($array); 
} 
1

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

Надеемся, это поможет вам усовершенствовать собственное решение.

обновлен с учетом возврата результат в виде строки, а не вторя из функции

function Process_Array($arr, $depth) { 
    $retVal = ''; 
    foreach($arr as $k => $v) { 
     for($i = 0; $i < $depth; $i++) 
      $retVal .= '&nbsp;&nbsp;'; 
     $retVal .= $k . ': '; 

     if(is_array($v)) 
      $retVal .= '<br>' . Process_Array($v, $depth + 1); 
     else 
      $retVal .= $v . '<br>'; 
    } 

    return $retVal; 
} 

$test = array( 
    'test1', 
    'test2', 
    array( 
     'test3', 
     array( 
      'test4', 
      'test5' 
     ), 
     'test6' 
    ), 
    'test7' 
); 

echo Process_Array($test, 0); 

Выход:

0: test1 
1: test2 
2: 
    0: test3 
    1: 
    0: test4 
    1: test5 
    2: test6 
3: test7 
0

Вот еще один. Однако я бы использовал дополнительные условия для объектов.

$arr = array(1,array('2a','2b',array('3a','3b')),4,5,array(),'example',''); 

function Process_Array($arr, $pre_str='', $space_count=-1) { 
    $result = ''; 
    $spaces = ''; 
    for ($i = 0; $i < $space_count; $i++) $spaces .= '&nbsp;'; 
    if (is_array($arr) && !empty($arr)) { 
     foreach ($arr as $key => $value) { 
      $result .= Process_Array($value,$pre_str,$space_count+1); 
     } 
    } else $result .= $spaces . $pre_str . (empty($arr) ? '' : $arr) . "<br />\n"; 
    return $result; 
} 

echo Process_Array($arr,'Value = '); 

Выходы:

Value = 1
  Значение = 2a
  Значение = 2b
    Значение = 3a
    Значение = 3b
Значение = 4
Значение = 5
Значение =
Значение = пример
Значение =

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