为什么这个可扩展列表在 php 中没有以正确的方式显示项目?
Why is this expandable list not showing items in correct manner in php?
我正在尝试创建一个可扩展列表。它以下列方式正确显示 1 个节点:
- 大学
- 部门0
- 课程 0
学生0
但是,当我对超过 1 个项目执行相同操作时,即。当部门数量超过 1 时,它会将列表分发到任何地方。这是我的代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Family Tree</title>
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen, projection">
<script type="text/javascript" src="js/jquery-1.4.2.min.js">
</script>
<script type="text/javascript" src="js/scripts.js">
</script>
</script>
</head>
<body>
<h1><b>Demo ExpandableList</b></h1>
<div id="listContainer">
<div class="listControl">
<a id="expandList">Expand All</a>
<a id="collapseList">Collapse All</a>
</div>
<ul id="expList">
<?php
echo '<li>';
echo 'University';
for($department = 0; $department < 3; $department++){
if($department == 0){
echo '<ul>';
echo '<li>';
echo "d".$department;
}
else if($department == $countOfDepartments - 1){
echo '</li>';
echo '</ul>';
} else{
echo '<li>';
echo "d".$department;
}
for($course = 0; $course < 3; $course++){
if($course == 0){
echo '<ul>';
echo '<li>';
echo "c".$course;
}
else if($course == $countOfCourses - 1){
echo '</li>';
echo '</ul>';
} else{
echo '<li>';
echo "c".$course;
}
for($student = 0; $student < 3; $student++){
if($student == 0){
echo '<ul>';
echo '<li>';
echo "s".$student;
}
else if($student == $countOfStudents - 1){
echo '</li>';
echo '</ul>';
} else{
echo '<li>';
echo "s".$student;
}
} // for - 3
} // for - 2
}// for - 1
echo '</li>';
?>
</ul>
</div>
</body>
</html>
styles.js:
function prepareList() {
$('#expList').find('li:has(ul)')
.click( function(event) {
if (this == event.target) {
$(this).toggleClass('expanded');
$(this).children('ul').toggle('medium');
}
return false;
})
.addClass('collapsed')
.children('ul').hide();
//Create the button funtionality
$('#expandList')
.unbind('click')
.click( function() {
$('.collapsed').addClass('expanded');
$('.collapsed').children().show('medium');
})
$('#collapseList')
.unbind('click')
.click( function() {
$('.collapsed').removeClass('expanded');
$('.collapsed').children().hide('medium');
})
};
$(document).ready( function() {
prepareList()
});
style.css:
body {
font-size: 16px;
}
#menu {
list-style: none;
padding: 0;
margin: 0;
}
.clear {
clear: both;
}
/********************/
/* EXPANDABLE LIST */
/********************/
#listContainer{
margin-top:15px;
}
#expList ul, li {
list-style: none;
margin:0;
padding:0;
cursor: pointer;
}
#expList p {
margin:0;
display:block;
}
#expList p:hover {
background-color:#121212;
}
#expList li {
line-height:140%;
text-indent:0px;
background-position: 1px 8px;
padding-left: 20px;
background-repeat: no-repeat;
}
/* Collapsed state for list element */
#expList .collapsed {
background-image: url(../img/collapsed.png);
}
/* Expanded state for list element
/* NOTE: This class must be located UNDER the collapsed one */
#expList .expanded {
background-image: url(../img/expanded.png);
}
#expList {
clear: both;
}
.listControl{
margin-bottom: 15px;
}
.listControl a {
border: 1px solid #555555;
color: #555555;
cursor: pointer;
height: 1.5em;
line-height: 1.5em;
margin-right: 5px;
padding: 4px 10px;
}
.listControl a:hover {
color:#222222;
font-weight:normal;
}
我要获取的列表格式如下;
- 大学
- 部门0
- 课程 0
- 学生0
- 学生 1
- 学生 2
- 部门1
- 课程1
- 学生0
- 学生 1
- 学生 2
- 部门2
- 课程2
- 学生0
- 学生 1
- 学生 2
我可能做错了什么?我的逻辑似乎是正确的。
损坏的代码:PHP 错误
您的代码会引发类似
的错误
"Notice: Undefined variable: countOfStudents
"
(与 countOfCourses
和 countOfDepartments
相同)因为您没有定义这些变量:
for ($department = 0; $department < 3; $department++) {
if ($department == 0) {
//...
else if ($department == $countOfDepartments - 1) {
相反,它应该是这样的(假设之前定义了 $countOfDepartments
):
for ($department = 0; $department < $countOfDepartments; $department++) {
if ($department == 0) {
//...
else if ($department == $countOfDepartments - 1) {
代码未按预期运行
现在,如果我们只是用3
替换未定义的变量,现在它可以正常工作,但它缺少打开最后一次出现的部门、课程和学生,像这样:
部门如下图,您的代码依次为:
大学 <ul>
,然后 <li>
部门 #0:
if ($department == 0) {
echo '<ul>';
echo '<li>';
echo "d".$department;
}
关闭 <li>
(最后一个)部门 #2,然后 <ul>
关闭大学:
else if ($department == 3 - 1) {
echo '</li>';
echo '</ul>';
为任何其他部门(此处#1)打开<li>
:
} else {
echo '<li>';
echo "d".$department;
}
你会注意到它没有打开最后一个部门和最后一个课程,也不显示最后一个学生,更不用说关闭除最后一个部门以外的所有部门(幸运的是浏览器管理)。
如何让它工作
以上是为了解释为什么您没有得到您所期望的。但我不会向您建议一种更正解决方案的方法,因为它太复杂而且不是最有效的方法。
相反,您可以使用递归方法,如下所示:
function array2ul($array) {
$return = NULL;
foreach ($array as $key => $value) {
$return .=
'<li>' . $key . (is_array($value) ? array2ul($value) : $value) . '</li>';
}
return '<ul>' . $return . '</ul>';
}
那么整个大学<li>
就变成了:
echo array2ul([
'd0' => [
'c0' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c1' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c2' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
],
'd1' => [
'c0' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c1' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c2' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
],
'd2' => [
'c0' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c1' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c2' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
],
]);
在这个阶段你可能会说这个解决方案使用了一个非常简单的函数,但需要一个有点沉重的先前定义!
这是因为我猜您提供的案例仅作为示例,而对于您的实际应用程序,您将从数据库中获取源数据,因此您必须调整源数据(可能还有函数)以适应实际结构你明白了。
无论如何,至少为了好玩,让我们把当前的例子变成一个更简单的形式。您可以仅根据您的需求来生成上述结构,如下所示:
function generate($groups) {
$name = key($groups);
$number = array_shift($groups);
for ($i = 0; $i < $number; $i++) {
$out[$name . $i] = $groups ? generate($groups) : NULL;
}
return $out;
}
那么整个大学<li>
就变成了:
echo array2ul(generate(['d' => 3, 'c' => 3, 's' => 3]));
最后这是您的整个 HTML 代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Family Tree</title>
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen, projection">
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/scripts.js"></script>
</head>
<body>
<h1><b>Demo ExpandableList</b></h1>
<div id="listContainer">
<div class="listControl">
<a id="expandList">Expand All</a>
<a id="collapseList">Collapse All</a>
</div>
<ul id="expList">
<li>
University
<?php echo array2ul(generate(['d' => 3, 'c' => 3, 's' => 3])); ?>
</li>
</ul>
</div>
</body>
</html>
<?php
function array2ul($array) {
$return = NULL;
foreach ($array as $key => $value) {
$return .=
'<li>' . $key . (is_array($value) ? array2ul($value) : $value) . '</li>';
}
return '<ul>' . $return . '</ul>';
}
function generate($groups) {
$name = key($groups);
$number = array_shift($groups);
for ($i = 0; $i < $number; $i++) {
$out[$name . $i] = $groups ? generate($groups) : NULL;
}
return $out;
}
它现在给出了预期的结果:
我正在尝试创建一个可扩展列表。它以下列方式正确显示 1 个节点:
- 大学
- 部门0
- 课程 0 学生0
- 部门0
但是,当我对超过 1 个项目执行相同操作时,即。当部门数量超过 1 时,它会将列表分发到任何地方。这是我的代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Family Tree</title>
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen, projection">
<script type="text/javascript" src="js/jquery-1.4.2.min.js">
</script>
<script type="text/javascript" src="js/scripts.js">
</script>
</script>
</head>
<body>
<h1><b>Demo ExpandableList</b></h1>
<div id="listContainer">
<div class="listControl">
<a id="expandList">Expand All</a>
<a id="collapseList">Collapse All</a>
</div>
<ul id="expList">
<?php
echo '<li>';
echo 'University';
for($department = 0; $department < 3; $department++){
if($department == 0){
echo '<ul>';
echo '<li>';
echo "d".$department;
}
else if($department == $countOfDepartments - 1){
echo '</li>';
echo '</ul>';
} else{
echo '<li>';
echo "d".$department;
}
for($course = 0; $course < 3; $course++){
if($course == 0){
echo '<ul>';
echo '<li>';
echo "c".$course;
}
else if($course == $countOfCourses - 1){
echo '</li>';
echo '</ul>';
} else{
echo '<li>';
echo "c".$course;
}
for($student = 0; $student < 3; $student++){
if($student == 0){
echo '<ul>';
echo '<li>';
echo "s".$student;
}
else if($student == $countOfStudents - 1){
echo '</li>';
echo '</ul>';
} else{
echo '<li>';
echo "s".$student;
}
} // for - 3
} // for - 2
}// for - 1
echo '</li>';
?>
</ul>
</div>
</body>
</html>
styles.js:
function prepareList() {
$('#expList').find('li:has(ul)')
.click( function(event) {
if (this == event.target) {
$(this).toggleClass('expanded');
$(this).children('ul').toggle('medium');
}
return false;
})
.addClass('collapsed')
.children('ul').hide();
//Create the button funtionality
$('#expandList')
.unbind('click')
.click( function() {
$('.collapsed').addClass('expanded');
$('.collapsed').children().show('medium');
})
$('#collapseList')
.unbind('click')
.click( function() {
$('.collapsed').removeClass('expanded');
$('.collapsed').children().hide('medium');
})
};
$(document).ready( function() {
prepareList()
});
style.css:
body {
font-size: 16px;
}
#menu {
list-style: none;
padding: 0;
margin: 0;
}
.clear {
clear: both;
}
/********************/
/* EXPANDABLE LIST */
/********************/
#listContainer{
margin-top:15px;
}
#expList ul, li {
list-style: none;
margin:0;
padding:0;
cursor: pointer;
}
#expList p {
margin:0;
display:block;
}
#expList p:hover {
background-color:#121212;
}
#expList li {
line-height:140%;
text-indent:0px;
background-position: 1px 8px;
padding-left: 20px;
background-repeat: no-repeat;
}
/* Collapsed state for list element */
#expList .collapsed {
background-image: url(../img/collapsed.png);
}
/* Expanded state for list element
/* NOTE: This class must be located UNDER the collapsed one */
#expList .expanded {
background-image: url(../img/expanded.png);
}
#expList {
clear: both;
}
.listControl{
margin-bottom: 15px;
}
.listControl a {
border: 1px solid #555555;
color: #555555;
cursor: pointer;
height: 1.5em;
line-height: 1.5em;
margin-right: 5px;
padding: 4px 10px;
}
.listControl a:hover {
color:#222222;
font-weight:normal;
}
我要获取的列表格式如下;
- 大学
- 部门0 - 课程 0 - 学生0 - 学生 1 - 学生 2
- 部门1 - 课程1 - 学生0 - 学生 1 - 学生 2
- 部门2 - 课程2 - 学生0 - 学生 1 - 学生 2
我可能做错了什么?我的逻辑似乎是正确的。
损坏的代码:PHP 错误
您的代码会引发类似
的错误"Notice: Undefined variable:
countOfStudents
"
(与 countOfCourses
和 countOfDepartments
相同)因为您没有定义这些变量:
for ($department = 0; $department < 3; $department++) {
if ($department == 0) {
//...
else if ($department == $countOfDepartments - 1) {
相反,它应该是这样的(假设之前定义了 $countOfDepartments
):
for ($department = 0; $department < $countOfDepartments; $department++) {
if ($department == 0) {
//...
else if ($department == $countOfDepartments - 1) {
代码未按预期运行
现在,如果我们只是用3
替换未定义的变量,现在它可以正常工作,但它缺少打开最后一次出现的部门、课程和学生,像这样:
部门如下图,您的代码依次为:
大学
<ul>
,然后<li>
部门 #0:if ($department == 0) { echo '<ul>'; echo '<li>'; echo "d".$department; }
关闭
<li>
(最后一个)部门 #2,然后<ul>
关闭大学:else if ($department == 3 - 1) { echo '</li>'; echo '</ul>';
为任何其他部门(此处#1)打开
<li>
:} else { echo '<li>'; echo "d".$department; }
你会注意到它没有打开最后一个部门和最后一个课程,也不显示最后一个学生,更不用说关闭除最后一个部门以外的所有部门(幸运的是浏览器管理)。
如何让它工作
以上是为了解释为什么您没有得到您所期望的。但我不会向您建议一种更正解决方案的方法,因为它太复杂而且不是最有效的方法。
相反,您可以使用递归方法,如下所示:
function array2ul($array) {
$return = NULL;
foreach ($array as $key => $value) {
$return .=
'<li>' . $key . (is_array($value) ? array2ul($value) : $value) . '</li>';
}
return '<ul>' . $return . '</ul>';
}
那么整个大学<li>
就变成了:
echo array2ul([
'd0' => [
'c0' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c1' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c2' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
],
'd1' => [
'c0' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c1' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c2' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
],
'd2' => [
'c0' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c1' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
'c2' => ['s0' => NULL, 's1' => NULL, 's2' => NULL,],
],
]);
在这个阶段你可能会说这个解决方案使用了一个非常简单的函数,但需要一个有点沉重的先前定义!
这是因为我猜您提供的案例仅作为示例,而对于您的实际应用程序,您将从数据库中获取源数据,因此您必须调整源数据(可能还有函数)以适应实际结构你明白了。
无论如何,至少为了好玩,让我们把当前的例子变成一个更简单的形式。您可以仅根据您的需求来生成上述结构,如下所示:
function generate($groups) {
$name = key($groups);
$number = array_shift($groups);
for ($i = 0; $i < $number; $i++) {
$out[$name . $i] = $groups ? generate($groups) : NULL;
}
return $out;
}
那么整个大学<li>
就变成了:
echo array2ul(generate(['d' => 3, 'c' => 3, 's' => 3]));
最后这是您的整个 HTML 代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Family Tree</title>
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen, projection">
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/scripts.js"></script>
</head>
<body>
<h1><b>Demo ExpandableList</b></h1>
<div id="listContainer">
<div class="listControl">
<a id="expandList">Expand All</a>
<a id="collapseList">Collapse All</a>
</div>
<ul id="expList">
<li>
University
<?php echo array2ul(generate(['d' => 3, 'c' => 3, 's' => 3])); ?>
</li>
</ul>
</div>
</body>
</html>
<?php
function array2ul($array) {
$return = NULL;
foreach ($array as $key => $value) {
$return .=
'<li>' . $key . (is_array($value) ? array2ul($value) : $value) . '</li>';
}
return '<ul>' . $return . '</ul>';
}
function generate($groups) {
$name = key($groups);
$number = array_shift($groups);
for ($i = 0; $i < $number; $i++) {
$out[$name . $i] = $groups ? generate($groups) : NULL;
}
return $out;
}
它现在给出了预期的结果: