Php Foreach循环和阵列构建
我有一个管理区,在那里他们可以一次删除多个用户。这是处理删除的代码的一部分。基本上,它会遍历用户ID并删除每个标记为选中的IDPhp Foreach循环和阵列构建,php,string,Php,String,我有一个管理区,在那里他们可以一次删除多个用户。这是处理删除的代码的一部分。基本上,它会遍历用户ID并删除每个标记为选中的ID if ($_POST['doDelete'] == 'Delete') { if (!empty($_POST['u'])) { foreach ($_POST['u'] as $uid) { $id = escape($uid); $delete = Nemesis::query("DELETE
if ($_POST['doDelete'] == 'Delete') {
if (!empty($_POST['u'])) {
foreach ($_POST['u'] as $uid) {
$id = escape($uid);
$delete = Nemesis::query("DELETE FROM users WHERE id = '{$id}' AND id <> '{$_SESSION[user_id]}'");
if (!$delete) {
$msg->add('e', QUERY_ERROR);
redirect('users.php');
exit();
}
}
}
/* we need a way to iterate over users deleted */
$msg = new Messages();
$msg->add('s', QUERY_DELETE_SUCCESS);
redirect('users.php');
exit();
}
function get_user_name_from_id($user_id)
{
if ($_SESSION['user_level'] == ADMIN_LEVEL) {
$viewUserMod = 1;
} else {
$config = Nemesis::select("usr_view_cm", "config");
$row_config = $config->fetch_assoc();
$viewUserMod = $row_config['usr_view_cm'];
}
if (is_numeric($user_id) && $viewUserMod == 1) {
$sql = Nemesis::select("full_name", "users", "id = {$user_id}");
if ($sql->num_rows > 0) {
$user_name = $sql->fetch_assoc();
return $user_name['full_name'];
} else {
// user name cannot be matched with db, either error, or most likely user was deleted
return 'User ' . $user_id;
}
} else {
return $user_id;
}
}
其中显示QUERY\u DELETE\u SUCCESS,我想输出类似Deleted Bob、Jack、Tim等的内容。我有一个函数,它使用用户id并获取他们的姓名。问题是一旦迭代完成。显然,数据库中不再存在这些用户,我无法获取他们的姓名。是否有方法在循环期间运行此函数,并构建字符串或数组。可以输出以代替消息?在UID上循环时,您可以将名称添加到数组中,如下所示:
$names = array();
if (!empty($_POST['u'])) {
foreach ($_POST['u'] as $uid) {
$names[] = get_user_name_from_id($uid);
$id = escape($uid);
$delete = Nemesis::query("DELETE FROM users WHERE id = '{$id}' AND id <> '{$_SESSION[user_id]}'");
if (!$delete) {
$msg->add('e', QUERY_ERROR);
redirect('users.php');
exit();
}
}
}
$names = implode(', ',$names);
$message = "Deleted $names";
您应该能够做到这一点:
if ($_POST['doDelete'] == 'Delete') {
$deleted = array();
if (!empty($_POST['u'])) {
foreach ($_POST['u'] as $uid) {
$id = escape($uid);
$username = get_user_name_from_id($uid);
$delete = Nemesis::query("DELETE FROM users WHERE id = '{$id}' AND id <> '{$_SESSION[user_id]}'");
if (!$delete) {
$msg->add('e', QUERY_ERROR);
redirect('users.php');
exit();
}
$deleted[] = $username // push name to array after deletion is successful
}
}
/* The $deleted array now holds the names of the deleted users.
* Do with it what you want.
*/
$names = implode(",", $deleted)
$msg = new Messages();
$msg->add('s', QUERY_DELETE_SUCCESS . " Deleted: $names");
redirect('users.php');
exit();
}
这里可以做一些改进,包括将许多小的单个查询有效地组合成几个大的查询,错误处理不会在第一个错误时重定向,而是在所有处理完成后重定向到包含成功和错误列表的页面,但这是基本思想
下面是一个快速更改,它将执行所有操作,即使其中一个操作出错:
if ($_POST['doDelete'] == 'Delete') {
$deleted = array();
$errored = array();
if (!empty($_POST['u'])) {
foreach ($_POST['u'] as $uid) {
$id = escape($uid);
$username = get_user_name_from_id($uid);
$delete = Nemesis::query("DELETE FROM users WHERE id = '{$id}' AND id <> '{$_SESSION[user_id]}'");
if (!$delete) {
$errored[] = $username;
} else {
$deleted[] = $username // push name to array after deletion is successful
}
}
}
/* The $deleted array now holds the names of the deleted users.
* The $errored array now holds the names of users who were not deleted due to errors.
* Do with them what you want.
*/
$msg = new Messages();
$names_deleted = implode(",", $deleted)
$msg->add('s', QUERY_DELETE_SUCCESS . " Deleted: $names_deleted");
if (count($errored) > 0) {
$names_errored = implode(",", $errored)
$msg->add('e', QUERY_ERROR . " Did not delete: $names_errored");
}
redirect('users.php');
exit();
}
这意味着您必须调用getname函数,并使用它在执行每个delete语句之前构建一个已删除用户名的数组。例如,如果我们有3次删除。第一个有效,第二个无效,第三个也有效。你怎么知道哪个成功了,哪个失败了?我想我明白了。所以基本上,如果它失败了,就做一个数组,如果它通过了,就做另一个数组。最后检查它们是否都是空的。如果它们都是arnt,则显示已删除和未删除的用户?@Alex是的,这与我的做法很接近。我已经更新了我的例子。是的,这和我写的差不多。除了我用过的如果!空$fail。。。对数组进行计数和清空有什么区别吗?因为我读到他们实现了同样的目标。@Alex是的,数一数$array>0和!空$array将执行相同的操作:检查数组是否有任何元素。使用哪一种主要取决于个人偏好。