You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP日历任务创建器:如何解决数组仅显示最后一项任务的问题?

问题分析

你的代码每次请求都会重新初始化$tasks数组,只存入当前提交的任务,所以之前的任务无法保留。要实现多任务存储,不用数据库的话,可以用Session临时存储或者本地文件持久化存储两种方案,下面分别给出实现方式:

方案一:用Session临时存储任务(会话级,关闭浏览器后丢失)

这种方式适合临时保存任务,不需要永久存储的场景:

  1. 在PHP代码最开头开启Session:
session_start();
  1. 替换原有的任务处理代码为以下内容:
// 初始化任务数组:如果Session中没有tasks,就创建空数组
if (!isset($_SESSION['tasks'])) {
    $_SESSION['tasks'] = [];
}

// 当有新任务提交时(task_name存在且不为空),添加到Session的任务数组
if (isset($_GET['task_name']) && !empty($_GET['task_name']) && isset($_GET['day'], $_GET['month'], $_GET['year'])) {
    $newTask = [
        'name' => $_GET['task_name'],
        'day' => $_GET['day'],
        'month' => $_GET['month'],
        'year' => $_GET['year']
    ];
    $_SESSION['tasks'][] = $newTask;
}

// 显示任务
echo "<h2>Tasks</h2>";
echo "<table>";
echo "<tr><th>Task Name</th><th>Date</th></tr>";
// 遍历Session中的任务数组
foreach ($_SESSION['tasks'] as $task) {
    echo "<tr>";
    echo "<td>{$task['name']}</td>";
    echo "<td>{$task['day']}/{$task['month']}/{$task['year']}</td>";
    echo "</tr>";
}
echo "</table>";

方案二:用JSON文件持久化存储任务(永久保存,除非删除文件)

如果需要任务永久保存,推荐用JSON文件存储(确保PHP对当前目录有读写权限):

替换原任务处理代码为:

$taskFile = 'tasks.json';

// 初始化任务数组:读取文件,不存在则创建空数组
$tasks = [];
if (file_exists($taskFile)) {
    $jsonContent = file_get_contents($taskFile);
    $tasks = json_decode($jsonContent, true) ?: [];
}

// 当有新任务提交时,添加到数组并写入文件
if (isset($_GET['task_name']) && !empty($_GET['task_name']) && isset($_GET['day'], $_GET['month'], $_GET['year'])) {
    $newTask = [
        'name' => $_GET['task_name'],
        'day' => $_GET['day'],
        'month' => $_GET['month'],
        'year' => $_GET['year']
    ];
    $tasks[] = $newTask;
    // 格式化JSON后写入文件,方便查看
    file_put_contents($taskFile, json_encode($tasks, JSON_PRETTY_PRINT));
}

// 显示任务
echo "<h2>Tasks</h2>";
echo "<table>";
echo "<tr><th>Task Name</th><th>Date</th></tr>";
foreach ($tasks as $task) {
    echo "<tr>";
    echo "<td>{$task['name']}</td>";
    echo "<td>{$task['day']}/{$task['month']}/{$task['year']}</td>";
    echo "</tr>";
}
echo "</table>";

原代码的两个关键错误修正

  1. 原代码中'name' => '$task_name'用了单引号,变量不会被解析,应该直接传入$task_name;
  2. 遍历任务时用了{$task_name},应该改为{$task['name']},否则会一直显示最后提交的任务名。

内容的提问来源于stack exchange,提问作者buffalo09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:11:13