具有左、右和深度的PHP递归foreach

具有左、右和深度的PHP递归foreach,php,json,recursion,foreach,Php,Json,Recursion,Foreach,我有一个来自geonames.org的json文件,我想使用php recursive foreach添加该文件中的数据 我只是成功了,我只是不理解左右深度的概念。深度已正确保存 我的代码是: public function buildTree($elements, $count = 1, $depth = 0) { if (isset($elements->geonames)) { foreach ($elements->geonam

我有一个来自geonames.org的json文件,我想使用php recursive foreach添加该文件中的数据

我只是成功了,我只是不理解左右深度的概念。深度已正确保存

我的代码是:

public function buildTree($elements, $count = 1, $depth = 0)
    {
        if (isset($elements->geonames)) {
            foreach ($elements->geonames as $element) {
                $left = $count++;

                $elementDB = new \App\Geo();

                $elementDB->id        = $element->geonameId;
                $elementDB->parent_id  = NULL;
                $elementDB->left      = $left;
                $elementDB->right     = $right;
                $elementDB->depth     = $depth;
                $elementDB->name      = $element->name;
                $elementDB->country   = $element->countryCode;
                $elementDB->level     = $element->fcode;
                $elementDB->lat       = $element->lat;
                $elementDB->long      = $element->lng;
                $elementDB->save();

                $elements = $this->getList($element->geonameId, 'element');

                if ($depth < 1) {
                    $this->buildTree($elements, $count, $depth + 1);
                }

                $right = $count++;

                echo "Added element " . $element->name . "\n";
            }
        }
    }
公共函数构建树($elements,$count=1,$depth=0)
{
如果(isset($elements->geonames)){
foreach($elements->geonamesas$element){
$left=$count++;
$elementDB=new\App\Geo();
$elementDB->id=$element->geonameId;
$elementDB->parent\u id=NULL;
$elementDB->left=$left;
$elementDB->right=$right;
$elementDB->depth=$depth;
$elementDB->name=$element->name;
$elementDB->country=$element->countryCode;
$elementDB->level=$element->fcode;
$elementDB->lat=$element->lat;
$elementDB->long=$element->lng;
$elementDB->save();
$elements=$this->getList($element->geonameId,'element');
如果($depth<1){
$this->buildTree($elements,$count,$depth+1);
}
$right=$count++;
回显“已添加元素”。$element->name.\n;
}
}
}

我假设您正在创建一个二进制搜索树。基本上,树是一个有根、“规则”节点和叶子的图

在顶部总是有一个单独的根,它是一个特定的节点

叶子下面没有其他节点,它们是树的“末端”

常规节点可能有两个子节点,一个较小(左侧)和一个较大(右侧)。这是这样的:


如您所见,来自根的左子节点的所有节点都小于8。右边的孩子都大于8岁。这样,当您搜索“10”时,您立即知道您必须通过根的右子级,而不需要探索左侧(这意味着处理时间更短)。

可能的二叉搜索树搜索算法实现如下:

function buildTree($elements, $left, $right, $needle){
    if ($left > $right) return null;
    $middle = floor(($left + $right) / 2);
    $val = $elements[$middle];
    if ($val === $needle) return $val;
    else if ($val < $needle) return buildTree($elements, $left + 1, $right, $needle);
    else if ($val > $needle) return buildTree($elements, $left, $right + 1, $needle);
}

echo buildTree([1, 2, 3, 4, 5], 0, 5, 4);
函数构建树($elements、$left、$right、$needle){
如果($left>$right),则返回null;
$middle=楼层($left+$right)/2);
$val=$elements[$middle];
如果($val==$pinder)返回$val;
else if($val<$needle)返回buildTree($elements,$left+1,$right,$needle);
else if($val>$needle)返回buildTree($elements,$left,$right+1,$needle);
}
echo构建树([1,2,3,4,5],0,5,4);

您只需将其适应您的问题

您似乎想了解它是如何工作的? 您可以使用递归来处理每个元素。变量$elements是带有节点的树(或子树)。代码必须从左到右浏览树。在每次迭代中检查$elements是否有节点。如果$elements有(可能是有序数组或带字段的结构)节点,则必须处理这些节点。在每次检查期间,您都会检测每个节点是否有其他子节点。当您找到第一个(我们称之为“A”)节点,该节点具有其他子节点时,您必须在下一次迭代递归中进入该节点,以处理当前子节点(“A”)的子节点。

这些数字表示在左右深度算法中访问节点的顺序

坦率地说,我不理解你所说的:

$this->buildTree($elements, $count, $depth + 1);
对于foreach中的变量,这是一个糟糕的样式重新分配:


您可能会对它感兴趣

,而在给定的代码中什么不起作用?不,它不起作用。这到底意味着什么?你期望从代码中得到什么?你试过调试这个问题吗?我已经添加了一张将要发生的事情的图片。