-1

我需要显示表格中的数据,并且每个条目都有一个父项,我的 php 代码如下所示:

function makeArbo($array, $currentParent = 0, $currLevel = 0, $prevLevel = -1, &$result = '')
        {
            if (is_array($array) && count($array) > 0)
            {
                foreach ($array as $item)
                {
                    if ($currentParent == $item['idParent'])
                    {                      
                        if ($currLevel > $prevLevel)
                            $result .= '<ul>';

                        if ($currLevel == $prevLevel)
                            $result .= '</li>';

                        $result .= '<li>'.$item['name'].'</li>';

                        if ($currLevel > $prevLevel)
                            $prevLevel = $currLevel;

                        $currLevel++;

                        makeArbo($array, $item['id'], $currLevel, $prevLevel, $result);

                        $currLevel--;
                    }  
                }

                if ($currLevel == $prevLevel)
                    $result .=  '</li></ul>';

                return $result;
            }
        }

        echo makeArbo($array);
        ?>
}

我的桌子看起来像这样:

<?php
        $array = array(
            array(
                'id'       => 1,
                'name'      => 'Maths',
                'idParent' => 0
            ),
            array(
                'id'       => 2,
                'name'      => 'Topologie',
                'idParent' => 1
            ),
            array(
                'id'       => 3,
                'name'      => 'Algèbre',
                'idParent' => 1
            ),
            array(
                'id'       => 4,
                'name'      => 'Algèbre linéaire',
                'idParent' => 3
            ),
            array(
                'id'       => 5,
                'name'      => 'Arithmétique',
                'idParent' => 3
            ),
            array(
                'id'       => 6,
                'name'      => 'Thérorème de Bézout',
                'idParent' => 5
            ),
            array(
                'id'       => 7,
                'name'      => 'Informatique',
                'idParent' => 0
            ),
            array(
                'id'       => 8,
                'name'      => 'C-C++',
                'idParent' => 7
            ),
            array(
                'id'       => 9,
                'name'      => 'Les pointeurs',
                'idParent' => 8
            )
        );
         }

结果是完美的:

 <ul>
        <li>Maths</li>
        <ul>
            <li>Topologie</li>
            <li>Algèbre</li>
            <ul>
                <li>Algèbre linéaire</li>
                <li>Arithmétique</li>
                <ul>
                    <li>Thérorème de Bézout</li>
                </ul>
            </ul>
        </ul>
        <li>Informatique</li>
        <ul>
            <li>C-C++</li>
            <ul>
                <li>Les pointeurs</li>
            </ul>
        </ul>
    </ul>

但我需要将此代码从 php 转换为 javascript;

我尝试了这样的javascript代码:

function makeArbo(array,currentParent,currLevel, prevLevel, result)
    {   
        if (typeof(currentParent)=='undefined'){

            currentParent=0 ;
            currLevel= 0 ;
            prevLevel=-1 ;
            result='';

    }
        if (array.length >0)
        {
          for (i=0;i< array.length;i++)
            {
                if (currentParent == array[i]['parentid'])
                {        
                   if (currLevel > prevLevel)
                        result += '<ul>';

                    if (currLevel == prevLevel)   
                        result += '</li>';

                    result += '<li>'+ array[i]['name']+'</li>';

                    if (currLevel > prevLevel)
                        prevLevel = currLevel;

                    currLevel++;
                    result+=makeArbo (array,array[i]['id'], currLevel, prevLevel, result.valueOf());

                    currLevel--;
                }  
           }
                  if  (currLevel == prevLevel) 
                  result += '</li></ul>';



         return result ;
        }

    }
}

回报不好,我没有像我的第一个 php 代码一样的回报。我认为这是交叉引用(通过引用)的问题,因为在我的 php 代码中,结果是通过引用传递的 "&$result = ''" 。

有什么建议么?

4

1 回答 1

0

我认为由于 $array.js 中的代码不正确。至于js,在传输数组的时候,只是复制数组的地址,不会复制整个状态。对于状态,我指的是您的代码中需要的数组中的当前位置。所以每次在js部分运行makeArbo函数时,数组总是从它所在位置的第一个元素开始,这不是你所期望的。

解决办法就是把数组移到函数外,让它成为一个全局变量,一切都会好的。

----------------------从这里开始阅读------------- ----------------------

1 Javascript 不提供关联数组,您需要使用对象来代替。看

function myVar(id, name, idParent){
          this.id = id;
          this.name = name;
          this.idParent = idParent;
}

2 在Javascript中,在其elt之前没有var的变量是全局变量。看

array = new Array(...

3 相应地替换您的其他代码。下面的代码在我自己的服务器中作为 html 文件进行了测试。

4 此外,您应该注意返回值。使用一个对象来保存返回值,否则我们无法得到我们想要的。这次终于一切正常,我可以上床睡觉了……

干杯!!

我的html文件:

<!DOCTYPE html>
<html>
<body>

<h1>My First Web Page</h1>

<p id="demo">My First Paragraph</p>

<script>

function myVar(id, name, idParent){
      this.id = id;
      this.name = name;
      this.idParent = idParent;
}

array = new Array(
    new myVar(1, "maths", 0),
    new myVar(2, "Topologie", 1),
    new myVar(3, "Algèbre", 1),
    new myVar(4, "Algèbre linéaire", 3),
    new myVar(5, "Arithmétique", 3),
    new myVar(6, "Thérorème de Bézout", 5),
    new myVar(7, "Informatique", 0),
    new myVar(8, "C-C++", 7),
    new myVar(9, "Les pointeurs", 8)
);

function run() {
    var result = {};//the object to hold the values' position
    result.value = "";//the real values;
    document.getElementById("demo").innerHTML = makeArbo(0, 0, -1, result).value;
}


function makeArbo(currentParent , currLevel, prevLevel, result)
{
    if (array.length >0)
    {
       for (var i = 0 ; i < array.length; i++)
       {
           if (currentParent == array[i].idParent)
           {        
               if (currLevel > prevLevel)
                   result.value += '<ul>';

               if (currLevel == prevLevel)   
                   result.value += '</li>';

               result.value += '<li>' + array[i].name + '</li>';

               if (currLevel > prevLevel)
                   prevLevel = currLevel;

               currLevel++;

               makeArbo(array[i].id, currLevel, prevLevel, result);

               currLevel--;
          }   
     }    
     if (currLevel == prevLevel) 
         result.value += '</li></ul>';

     return result;
}

}

window.onload = run;
</script>

</body>
</html>
于 2013-08-11T23:41:21.923 回答