PHP中判断数组是否包含WP_Term对象的条件写法求助
如何检测数组中是否包含WP_Term对象
首先得说,你用in_array('object', $array1)肯定行不通,问题出在这几点:
- 你要找的是WP_Term类的实例对象,不是字符串'object';
$array1的直接元素是ID、label、value这些键值对,而目标对象藏在value这个子数组里,in_array默认只会检查当前数组的直接值,不会深入子数组;- 就算对象在当前数组层级,
in_array默认的松散比较也没法准确判断对象类型,得用专门的对象检查方式。
下面给你几种靠谱的解决方案,根据你的需求选就行:
方法1:遍历子数组,用instanceof检查(最直观)
这是最容易理解和调试的方式,直接遍历value数组里的每个元素,判断是否是WP_Term的实例:
// 先初始化标记为false $hasWpTerm = false; // 先确保value键存在且是数组 if (isset($array1['value']) && is_array($array1['value'])) { foreach ($array1['value'] as $item) { // 用instanceof判断对象是否属于WP_Term类 if ($item instanceof WP_Term) { $hasWpTerm = true; break; // 找到目标就停止循环,提升效率 } } } // 最后判断输出 if ($hasWpTerm) { print 'correct'; }
instanceof是PHP中判断对象类型的标准关键字,它会准确检查一个对象是否是指定类(或其子类)的实例,完全适配你的需求。
方法2:用array_filter简化代码
如果你想写得更简洁,可以用array_filter过滤出所有WP_Term对象,再判断结果是否为空:
$hasWpTerm = false; if (isset($array1['value']) && is_array($array1['value'])) { // 过滤出value数组里所有WP_Term对象 $wpTermItems = array_filter($array1['value'], function($item) { return $item instanceof WP_Term; }); // 如果过滤结果不为空,说明存在目标对象 $hasWpTerm = !empty($wpTermItems); } if ($hasWpTerm) { print 'correct'; }
方法3:递归检查(如果需要深入所有层级)
如果你的数组结构不确定,对象可能藏在任意子数组里,可以写一个递归函数来遍历所有层级:
function hasWpTermRecursive($data) { foreach ($data as $item) { // 先检查当前元素是否是WP_Term对象 if ($item instanceof WP_Term) { return true; } // 如果是数组,递归检查子数组 if (is_array($item) && hasWpTermRecursive($item)) { return true; } } return false; } // 直接调用函数判断 if (hasWpTermRecursive($array1)) { print 'correct'; }
总结
- 优先用前两种方法,因为你的示例数组里对象固定在
value子数组中,不需要递归; - 永远用
instanceof来判断对象类型,而不是字符串匹配或其他松散比较方式; - 记得先检查目标数组/键是否存在,避免出现Undefined index或非数组的错误。
内容的提问来源于stack exchange,提问作者Jarek Jajok
相关产品推荐
相关产品推荐

