Мне нужно отображать данные из таблицы, и каждая запись имеет родителя, мой 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-код. Я думаю, что это проблема пересечения ссылки (по ссылке ref), потому что в моем php-коде результат получается по ссылке «& $ result = ''».
Какие-либо предложения?
Я думаю, что ваши коды в js не правы из-за массива $. Что касается js, когда массив переносится, он копирует только адрес массива, но не весь статус. Для статуса я имею в виду текущую позицию в массиве, которая необходима в ваших кодах. Поэтому каждый раз, когда функция makeArbo работает в части js ', массив всегда начинается с первого элемента в своей позиции, чего вы не ожидаете.
Решение просто перемещает массив вне функции и позволяет ему быть глобальной переменной, и все будет в порядке.
——————————— Просто начните читать здесь ————- ———————-
1 Javascript не предоставляет ассоциативные массивы , вам нужно вместо этого использовать объект. Видеть
function myVar(id, name, idParent){ this.id = id; this.name = name; this.idParent = idParent; }
2 В Javascript переменная без var перед itselt является глобальной переменной. Видеть
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>