unset 数组 json_encode 数据格式

本文探讨了PHP数组遍历时使用unset删除元素后,JSON编码出现的变化原因,并提供了一行代码解决方案,确保数组元素顺序不变。

今天 遇到了个很有趣的问题 

$arr = array(array(1,23),array(1,23),array(1,23));

var_dump($arr);
print_r(json_encode($arr));
echo '<br/>';
foreach($arr as $k=>$v)
{
	if ($k == 1)
	{
		unset($arr[$k]);
	}
}

var_dump($arr);
print_r(json_encode($arr));die;

这段代码执行完后的结果是



可以看到 unset后 在json_encode数据格式变了,研究了下, 大概是因为数组 被从中间去掉了个元素 为了保证数组的元素顺序被加上了数字key这样,以确认去掉了一个元素 二不使key发生变化可以看 绿色部分, 那么 怎么解决呢 只需一行代码搞定

在foreach之后加

$arr = array_values($arr);

将数组重新索引了下 就好了

### 解决PHP代码中退出登录时返回false的问题 在PHP中,退出登录功能通常涉及销毁会话(session)和清除相关的Cookie。如果退出登录时返回`false`,可能是由于以下原因导致的。以下是针对这些问题的解决方案: #### 1. 确保正确初始化会话 在调用 `session_destroy()` 或 `unset($_SESSION)` 之前,必须确保已通过 `session_start()` 启动了会话[^3]。如果没有启动会话,这些函数将无法正常工作。 ```php session_start(); if (isset($_SESSION['user_id'])) { unset($_SESSION['user_id']); session_destroy(); } else { echo json_encode(['success' => false, 'message' => '用户未登录']); } ``` #### 2. 清除所有会话变量 除了调用 `session_destroy()` 外,还需要确保所有会话变量都被清除。可以使用 `$_SESSION = array();` 来重置会话数组[^1]。 ```php session_start(); $_SESSION = array(); // 清空会话变量 session_destroy(); // 销毁会话 ``` #### 3. 删除与会话关联的Cookie 即使调用了 `session_destroy()`,浏览器中的会话Cookie可能仍然存在。需要手动删除与会话关联的Cookie[^2]。 ```php if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie( session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } ``` #### 4. 捕获并处理异常情况 如果在退出逻辑中涉及数据库操作(例如记录用户的最后登出时间),需要捕获并处理可能的异常情况[^4]。 ```php try { $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare("UPDATE users SET last_logout = NOW() WHERE id = ?"); $stmt->execute([$_SESSION['user_id']]); } catch (PDOException $e) { error_log('Database error: ' . $e->getMessage()); echo json_encode(['success' => false, 'message' => '退出失败,请稍后重试']); exit; } ``` #### 5. 返回正确的JSON响应 确保在退出成功或失败时返回正确的JSON响应。如果会话不存在或销毁失败,应返回适当的错误信息。 ```php session_start(); if (isset($_SESSION['user_id'])) { $_SESSION = array(); session_destroy(); echo json_encode(['success' => true, 'message' => '已成功退出登录']); } else { echo json_encode(['success' => false, 'message' => '用户未登录']); } ``` --- ### 示例代码:完整的退出登录逻辑 以下是一个完整的退出登录实现示例,涵盖了上述所有关键点: ```php <?php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'logout') { if (isset($_SESSION['user_id'])) { // 清空会话变量 $_SESSION = array(); // 销毁会话 session_destroy(); // 删除与会话关联的Cookie if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie( session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // 数据库操作:记录最后登出时间 try { $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare("UPDATE users SET last_logout = NOW() WHERE id = ?"); $stmt->execute([$_SESSION['user_id']]); } catch (PDOException $e) { error_log('Database error: ' . $e->getMessage()); } // 返回成功响应 echo json_encode(['success' => true, 'message' => '已成功退出登录']); } else { // 返回失败响应 echo json_encode(['success' => false, 'message' => '用户未登录']); } } ?> ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值