在PHP的foreach循环中如何从数组内移除另一个数组的全部元素
实现方案
PHP中foreach默认会遍历数组的副本,你在循环内修改原数组不会影响当前循环的遍历序列,这是之前操作不生效的核心原因。可选用以下两种方案实现需求:
方案1:改用while循环(推荐,性能更优)
动态调整原数组,不会遍历已经被移除的无效元素,避免重复查询:
<?php $all_posts = array('1', '2', '3', '4', '5'); // 示例数组 while (!empty($all_posts)) { // 取出数组第一个元素处理 $op_post = array_shift($all_posts); $op_title = get_the_title($op_post); $same_title_posts = get_posts([ // 查询同标题的其他帖子ID 'title' => $op_title, 'post__not_in' => array($op_post), 'posts_per_page' => -1, 'fields' => 'ids', ]); // 你的原有业务逻辑 foreach($same_title_posts as $same_title_post) { // function } // 批量移除所有同标题帖子ID,直接求差集即可 $all_posts = array_diff($all_posts, $same_title_posts); } ?>
方案2:保留原有foreach结构
如果不想改动原有循环结构,可在循环开头增加存在性校验,跳过已经被移除的元素:
<?php $all_posts = array('1', '2', '3', '4', '5'); // 示例数组 foreach ($all_posts as $op_post) { // 已被移除的元素直接跳过,不处理 if (!in_array($op_post, $all_posts)) { continue; } $op_title = get_the_title($op_post); $same_title_posts = get_posts([ // 查询同标题的其他帖子ID 'title' => $op_title, 'post__not_in' => array($op_post), 'posts_per_page' => -1, 'fields' => 'ids', ]); // 你的原有业务逻辑 foreach($same_title_posts as $same_title_post) { // function } // 批量移除所有同标题帖子ID $all_posts = array_diff($all_posts, $same_title_posts); } ?>
核心逻辑说明
array_diff(数组1, 数组2)会直接返回数组1中存在、但数组2中不存在的元素组成的新数组,一行代码即可完成批量移除,不需要手动循环逐个删除元素,写法更简洁高效。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

