【发布时间】:2018-03-26 02:04:25
【问题描述】:
我使用 array_reverse 将新创建的待办事项添加到列表顶部。但现在我无法删除它们。当我单击复选框删除项目时,它将删除列表另一端的项目。谁能告诉我颠倒顺序并让它们正确删除的最佳方法? array_reverse 是完成此任务的最佳方法还是有更好的选择。我的两个文件在下面。
index.php
<?php
// cookies
ini_set('session.gc_maxlifetime', 172800);
session_set_cookie_params(172800);
// array('get milk', 'feed dog');
include 'TaskList.php';
$list = new TaskList('tasks');
if(isset($_POST['task'])) {
// if post task is set the user submitted a task
$list->addItem($_POST['task']);
$list->save();
}
if(isset($_POST['delete'])) {
// delete this item from the array
$keys = $_POST['delete'];
foreach($keys as $key) {
array_reverse($list->deleteItem($key));
}
$list->save();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>To Do List</title>
</head>
<body>
<h1>To Do List</h1>
<!-- Insert Items -->
<form action="index.php" method="post">
<label for="task">
Enter task: <input type="text" name="task" id="task" value="" placeholder="Enter Task Here">
</label>
<input type="submit" name="" value="Add">
</form>
<form class="" action="index.php" method="post">
<ul>
<?php foreach(array_reverse($list->items) as $key => $task): ?>
<!-- [] tell browser that it's an array and to delete more than one item at a time -->
<li><input type="checkbox" name="delete[]" value="<?php echo $key ?>"><?php echo $task; ?></li>
<?php endforeach; ?>
</ul>
<input type="submit" name="" value="Delete">
</form>
<hr>
<?php var_dump(array_reverse($list->items)) ?>
</body>
</html>
任务列表.php
<?php
class TaskList {
var $items;
var $listname;
public function __construct($listname){
session_start();
$this->listname = $listname;
if(isset($_SESSION[$this->listname])) {
$this->items = $_SESSION[$this->listname];
}
else {
$this->items = array();
}
}
public function addItem($item) {
$this->items[] = $item;
}
public function deleteItem($key) {
unset($this->items[$key]);
}
public function save() {
$_SESSION[$this->listname] = $this->items;
}
}
【问题讨论】:
-
你不应该改变(并不断改变)你的数据结构只是为了以不同的方式显示它。这只是令人困惑。如果您希望它反向显示,您可以使用 for() 循环并向后退。这将保留您的键/值对。
-
如果你死心塌地使用
array_reverse(),你应该告诉它保留密钥(参见:php.net/manual/en/function.array-reverse.php) -
我必须承认,我有些困惑:为什么直接通过key访问要删除的元素时需要修改列表的顺序?
-
另外,你能澄清一下“当我单击复选框删除一个项目时,它会删除列表另一端的那个”是什么意思?
-
好的,感谢您的澄清。我只希望它的显示方式被反转,所以添加的项目会放在列表的顶部而不是底部。我所说的“删除对面”的意思是说,当我检查列表最底部的项目并单击删除时,它会删除顶部的项目。