PHP初学者求教:如何用foreach循环去除多维数组重复项及print_r用法
PHP多维数组去重与循环输出问题解答
嘿,作为PHP初学者碰到数组去重和循环里的输出问题太正常了,我来一步步帮你理清楚~
一、用foreach循环去除多维数组中的重复项
多维数组没法直接用array_unique()(这个函数只适合一维数组),用foreach的核心思路是:给每个子数组生成一个唯一标识(比如转成字符串),通过这个标识判断是否重复,进而筛选出不重复的元素。
举个实用的例子:
// 示例多维数组(包含重复项) $multiArray = [ ['id' => 1, 'skill' => 'PHP'], ['id' => 2, 'skill' => 'MySQL'], ['id' => 1, 'skill' => 'PHP'], // 重复的子数组 ['id' => 3, 'skill' => 'JavaScript'] ]; $tempKeys = []; // 存子数组转成的唯一标识,用来判断重复 $uniqueArray = []; // 最终去重后的数组 foreach ($multiArray as $item) { // 把每个子数组转成JSON字符串作为唯一键(也可以用serialize,JSON更易读) $uniqueKey = json_encode($item); // 如果这个标识没出现过,就保留当前子数组 if (!in_array($uniqueKey, $tempKeys)) { $tempKeys[] = $uniqueKey; $uniqueArray[] = $item; } } // 输出去重后的数组 print_r($uniqueArray);
运行后会得到没有重复子数组的结果,原理就是利用字符串的唯一性来判断子数组是否重复。
二、你的代码片段中print_r该填什么?
先看你这段代码的小问题:$nodecontainer {"id"}的语法不对,应该写成$nodecontainer['id']或者$nodecontainer["id"]。
再看逻辑:你现在的代码每次循环都会把$nodecontainer['id']覆盖成当前行的left_skill,然后遍历这个只有一个元素的数组,每次print_r($nodecontainer)都会输出当前的['id' => 当前left_skill]——这显然不是收集所有不重复项的逻辑。
如果你是想收集所有不重复的left_skill并最终输出,应该调整代码逻辑,比如:
// 先初始化空数组用来存不重复的技能 $nodecontainer = []; while($row = mysqli_fetch_assoc($result3)) { $leftSkill = $row['left_skill']; // 检查当前技能是否已经在数组里,不在就添加 if (!in_array($leftSkill, $nodecontainer)) { $nodecontainer[] = $leftSkill; } } // 循环结束后,打印去重后的所有技能 print_r($nodecontainer);
如果一定要在foreach里输出,比如每次添加新技能后打印当前的数组状态,可以这样写:
$nodecontainer = []; while($row = mysqli_fetch_assoc($result3)) { $leftSkill = $row['left_skill']; if (!in_array($leftSkill, $nodecontainer)) { $nodecontainer[] = $leftSkill; // 遍历当前数组,打印每个元素(可选) foreach ($nodecontainer as $index => $skill) { echo "索引: $index, 技能: $skill<br>"; } // 或者直接打印整个当前数组 print_r($nodecontainer); } }
这样每次添加新的不重复技能时,都会输出当前的数组内容。
内容的提问来源于stack exchange,提问作者Best Jeanist
相关产品推荐
相关产品推荐

