Рекурсия = страшно! (Codeigniter PHP) - PullRequest
1 голос
/ 14 февраля 2012

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

  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 ]

1 голос
/ 14 февраля 2012

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

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

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

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
1 голос
/ 14 февраля 2012

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

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

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

    print_r(array_pop($array));

    //recursive step
    return printArray($array);
}
0 голосов
/ 14 февраля 2012

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

$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 = ');

Выходы:

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

...