我想知道是否可以将值添加到foreach数组中,以保持它的运行,直到它不能再运行为止。这是一个简单的线程式留言板系统,当一个帖子被删除时,它也会删除它下面的所有帖子
我想,一个foreach循环可以将支柱拉到它下面,并将其添加到数组的末尾,以保持它的运行,直到它用完行为止,但我似乎无法让它继续运行所有行。
当前代码为:
foreach ($deleterows as $key => &$value) {
$sql = "SELECT id FROM posts WHERE replyto='$value'";
$query = mysqli_query($con,$sql) or die("cannot select next posts");
while ($newrow = mysqli_fetch_array($query)) {
array_push($deleterows,$newrow['id']);
}
}
第一个$deleterows是一个数组,其中包含所有回复我试图删除的帖子的帖子的ID。然后,对于每一篇文章,它都应该在数据库中搜索该帖子的回复,并将其添加到$row数组的末尾,以保持它的运行,直到它有了所有要删除的帖子的完整列表。
我尝试在测试帖子上这样做如下:
Post 53
-Post 54
--Post 55
---Post 56
-Post 57
--Post 58
帖子54和57是对主要帖子的回复,其他帖子是对它们的回复。
当我试图删除第53行时,$row数组中会有53、54、55、56行,但仍然不会得到第57或58行。谷歌之类的,就是想不通。
您可以尝试以下递归方法:
function delete($deleterows) {
global $con;
foreach ($deleterows as $key => &$value) {
$sql = "SELECT id FROM posts WHERE replyto='$value'";
$query = mysqli_query($con,$sql) or die("cannot select next posts");
$tmpdeleterows = array();
while ($newrow = mysqli_fetch_array($query)) {
$tmpdeleterows[]=$newrow['id'];
}
if(!empty($tmpdeleterows)) {
delete($tmpdeleterows);
}
}
}
所有的ID都被添加到一个临时数组中,然后被发送到同一个函数中进行处理。我添加了全局$con行,假设您的数据库连接在全局范围内,如果不是,您可以始终将其作为参数传递。
嗨,你可以使用这个代码,这在我的端上工作
$con = mysql_connect('SERVER_NAME', 'USERNAME', 'PASSWORD') or die();
mysql_select_db('DB_NAME', $con) or die();
$out = array();
$sql = mysql_query("SELECT id FROM posts WHERE replyto='53'");
while($result = mysql_fetch_assoc($sql)){
$ids[] = $result['id'];
}
// the main function to loop thru the IDs
$callback = function($value, $key) use (&$con, &$callback, &$out){
$sql = mysql_query("SELECT id FROM posts WHERE replyto='$value'");
$res = mysql_fetch_assoc($sql);
if($res){
array_walk_recursive($res, $callback);
}
$out[] = $value;
};
array_walk_recursive($ids, $callback);
echo "<pre>"; print_r($out);
它将输出
Array
(
[0] => 56
[1] => 55
[2] => 54
[3] => 58
[4] => 57
)
您可以将$out[]=$值替换为delete sql语句
在摆弄了几个我得到的答案后,却没能让它们发挥作用,我把它们和我在谷歌上找到的其他一些答案结合起来,编写了一个看起来很完美的简短脚本。
$deleterows = array();
$sql = "SELECT id FROM posts WHERE replyto='$postid'";
$query = mysqli_query($con,$sql) or die("Cannot select replies");
while($row = mysqli_fetch_array($query)) array_push($deleterows,$row['id']); #Get list of next level replies.
for($i=0; $i < count($deleterows); $i++) #loop through them and keep adding any further replies to the list to loop through.
{
$currentpost = $deleterows[$i];
$sql = "SELECT id FROM posts WHERE replyto='$currentpost'";
$query = mysqli_query($con,$sql) or die("Cannot select next post");
$count = mysqli_num_rows($query);
while($row = mysqli_fetch_array($query)) array_push($deleterows,$row['id']);
}
array_push($deleterows,$postid); #Add the original post to the deleterows array.
然后,我只需在deleterows数组上执行foreach循环,就可以将每个帖子的行更新为"已删除"。
看起来工作得很好。我不确定这是否是最好的路线,所以任何关于清理的额外建议都会很好。谢谢大家的帮助。