PHP如何判断数组中是否已存在键不同但指定子项值相同的元素
实现方法
你可以通过以下两种常用方案实现判断,按需选择即可:
方案1:遍历校验(适合小规模数组)
直接遍历现有$term数组,逐行对比item子项的内容是否相等,PHP中数组用==对比时只要所有键值对完全匹配就会返回true,刚好满足需求。
示例代码
// 封装判断函数 function hasSameItem(array $term, array $newElement): bool { foreach ($term as $element) { if ($element['item'] == $newElement['item']) { return true; } } return false; } // 业务调用逻辑 $term = array(); $common_item = array('id' => 0, 'full_name' => 'my great name'); $first_item = array('name' => 'Robert', 'item' => $common_item); $second_item = array('name' => 'Roberto', 'item' => $common_item); // 添加前校验 if (!hasSameItem($term, $first_item)) { $term[] = $first_item; } // 此处因为已有相同item,不会重复添加 if (!hasSameItem($term, $second_item)) { $term[] = $second_item; }
方案2:哈希校验(适合大规模数组,性能更高)
如果$term数组数据量较大,每次遍历的时间成本较高,可以额外维护一个哈希集合,将item序列化后作为索引,判断时直接查询索引是否存在即可,时间复杂度为O(1)。
示例代码
$term = array(); // 额外维护item哈希集合 $existItemHash = array(); function addElementIfNotExist(array &$term, array &$hashSet, array $newElement): void { $itemHash = serialize($newElement['item']); if (!isset($hashSet[$itemHash])) { $hashSet[$itemHash] = true; $term[] = $newElement; } } // 调用 $common_item = array('id' => 0, 'full_name' => 'my great name'); $first_item = array('name' => 'Robert', 'item' => $common_item); $second_item = array('name' => 'Roberto', 'item' => $common_item); addElementIfNotExist($term, $existItemHash, $first_item); addElementIfNotExist($term, $existItemHash, $second_item);
补充说明
- 如果你需要判断的是item是否为完全相同的内存对象,而非只是内容相同的两个数组,可以把对比逻辑中的
==替换为=== - 两种方案都支持item为嵌套数组的场景,不需要额外修改逻辑
内容的提问来源于stack exchange,提问作者Bobby Redjeans
相关产品推荐
相关产品推荐

