【问题标题】:Printing data without recursion不递归打印数据
【发布时间】:2014-07-21 22:27:30
【问题描述】:

其实没什么好问的。我想要打印数组,但不使用递归。原因是程序有一个错误,因为它的数据太多并且必须重写旧功能。该函数称为递归函数,经过多次调用,我的脚本无法分配更多内存,所以我的示例数组是:

array (
  0 => 
  array (
    'id' => '5713008',
    'children' => 
    array (
      0 => 
      array (
        0 => 
        array (
          'id' => '13',
          'children' => 
          array (
            'id' => '20',
            'children' => 
            array (
              0 => 
              array (
                'id' => '120',
              ),
              1 => 
              array (
                'id' => '464',
              ),
            ),
          ),
        ),
        1 => 
        array (
          0 => 
          array (
            'id' => '21',
          ),
        ),
      ),
      1 => 
      array (
        'id' => '143',
        'children' => 
        array (
          1 => 
          array (
            'id' => '60011',
          ),
          2 => 
          array (
            'id' => '60012',
          ),
          3 => 
          array (
            'id' => '5299316',
          ),
          4 => 
          array (
            'id' => '5712901',
          ),
          5 => 
          array (
            'id' => '147',
          ),
          6 => 
          array (
            'id' => '148',
          ),
          7 => 
          array (
            'id' => '149',
          ),
          8 => 
          array (
            'id' => '60010',
          ),
        ),
      ),
    ),
  ),
)

我需要这样的数据:

id: 5713008
--------------
>>id: 13
--------------
>>>>id: 20
--------------
>>>>>>>>id: 120
--------------
>>>>>>>>id: 464
--------------
>>>>id: 21
--------------
>>id: 143
--------------
>>>>id: 60011
--------------
>>>>id: 60012
--------------
>>>>id: 5299316
--------------
>>>>id: 5712901
--------------
>>>>id: 147
--------------
>>>>id: 148
--------------
>>>>id: 149
--------------
>>>>id: 60010
--------------

【问题讨论】:

标签: php algorithm recursion


【解决方案1】:
function myVarDump($item, $recursion = 0)
{
  if(is_array($item))
    foreach($item as $key => $value)
    {
      if(is_array($value))
        myVarDump($value, $recursion+1);     
      else
        echo str_repeat('>', $recursion)."$key: $value\n--------------\n";
    }
  else echo($item);
}

此函数将根据您的请求输出数据,但显然您仍需要递归才能显示嵌套项。因此,我并不完全理解您要解决的问题 - 也许您需要限制递归?如果是这样,只需在此函数中添加$recursion 可以变得多高的限制,例如:

function myVarDump($item, $recursion = 0, $maxRecursion = 5)
{
  if($recursion > $maxRecursion)
    echo str_repeat('>>', $recursion)."ERROR: Max recursion $maxRecursion exceeded";
  elseif(is_array($item))
    foreach($item as $key => $value)
    {
      if(is_array($value))
        myVarDump($value, $recursion+1);     
      else
        echo str_repeat('>', $recursion)."$key: $value\n--------------\n";
    }
  else echo($item);
}

【讨论】:

  • 编辑了,因为我怀疑这确实是他的问题。
  • 嗯,不知道这与“不使用递归”的要求如何对应
  • @AlmaDo 如果不使用递归,他所需的输出是不可能的。即使是展平阵列也需要它。
  • 好吧,我的评论不完整,承认。但重点仍然存在 - 如果递归炸毁了他的堆栈,堆栈数据结构在逻辑上也会如此 - 它们包含相同数量的迭代,并且基本上子例程调用是在汇编级别具有循环的平面堆栈数据结构。因此我非常好奇真正的XY problem 在这里是什么。
  • 好吧,我撤回了投票(因为任务是反向的,不是展平为树,而是树展平) - 但问题是一样的,可以使用堆栈+循环实现任何递归。然而,关于 XY 的观点是正确的,但我的观点是 - 在答案中提供两种方式(所以有递归和没有递归),然后 OP 将能够找出他在哪里做出错误的决策连接。它并不总是适用,但在这种情况下,我的观点将表明两种方式。所以不用担心 - 你的答案不是不正确,它可能只是不完整(不过,这只是我的意思..)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
相关资源
最近更新 更多