在 PHP 中获取嵌套数组的算法


Algorithm to fetch nested array in PHP

这个问题不一定与PHP或MongoDB有关。

我有带有类别集合的MongoDB数据库。集合中的文档如下所示

{
title : 'Parent 1',
cat_id : '_ABC1',
level : 1
}
{
title : 'Parent 2',
cat_id : '_ABC2'
level : 1
}
{
title : 'Child 1',
cat_id : '_ABC1_CEF1'
level : 2
}
{
title : 'Child 2',
cat_id : '_ABC1_CEF2'
level : 2
}
{
title : 'Child Child 1',
cat_id : '_ABC1_CEF1_GHI1'
level : 3
}
{
title : 'Child Child 2',
cat_id : '_ABC1_CEF1_GHI2'
level : 3
}

嵌 套现在,我想在PHP中做的是获取嵌套数组,例如

$array = array(
    array(
       'title' => 'Parent 1',
       'cat_id' => '_ABC1',
       'sub' => array(
          'title' => 'Child 1',
          'cat_id' => '_ABC1_CEF1',
          'sub' => array(
              array(
                 'title' => 'Child Child 1',
                 'cat_id' => '_ABC1_CEF1_GHI1'
              ),
              array(
                 'title' => 'Child Child 2',
                 'cat_id' => '_ABC1_CEF1_GHI2'
              )
          )
        )
    ),
    ...
    ...
)

为此,我使用以下算法(获取嵌套级别= N)(N 是一个获取参数编号,它告诉迭代器必须获取多深数组)

$array_holder = array();
foreach(MongoGetLevel1Cats as $parent){
  $parent['sub'] = array();
   foreach(MongoGetLevel2Cats as $child){
      $child['sub'] = array();
      foreach(MongoGetLevel3Cats as $child_child){
          $child_child['sub'] = array();
          ...
          ...
          array_push($child['sub'], $child_child);
        }
      array_push($parent['sub'], $child);
    }
  array_push($array_holder, $parent);
}
Return $array_holder;

因为这个函数会给我想要的结果,但我无法控制深度嵌套级别。如果必须获取 100 阶的嵌套级别,我必须为 foreach 循环编写 foreach 循环内部程序 100 次。我也不知道这种策略在性能方面是好是坏。

有人知道我们如何更具战略性地解决这个问题吗?也许与 for & foreach 循环组合在一起,不涉及嵌套 foreach 循环?

您可以使用回调函数。例如:

function add_two($result, $how_many_times)
{
  $result = $result + 2;//adds 2
  echo "current =".$result."<br>";
  $how_many_times--;
  if ($how_many_times>0)
  {
    $result = add_two($result, $n);
  }
  return $result;
}
$resultVar = add_two(5, 5);//should give 15...
echo "resultvar = ".$resultVar."<br>";//outputs: resultvar = 15

在前面的示例中,我将相同的函数add_two()放在自身内部,并创建了一个条件,用于查看我想要的迭代次数。每次迭代一次,我都会从$how_many_times中减去 1 个值。一旦$how_man_times == 0add_two()函数将不再被调用,结果将得到。

同样,您可以对代码执行相同的操作。如果你可以在它内部调用它,你就没有理由不得不重新编写相同的函数。

让我知道这是否是您要找的:)