PHP动态多层数组isset校验及JSON数组匹配正则实现问题
问题1:PHP动态多层级isset查询的替代方案
你现有的逐层循环实现逻辑完全正确,性能也足够应对常规的关键词校验场景,没有硬伤。如果想要更简洁的写法,可以用array_reduce来实现,代码如下:
function isKeywordValid(string $path, array $keywords): bool { $keys = explode(' > ', $path); return array_reduce($keys, function ($carry, $key) { return is_array($carry) && array_key_exists($key, $carry) ? $carry[$key] : false; }, $keywords) !== false; }
逻辑和你原有循环完全一致,只是用PHP内置函数简化了写法,不需要手动计数,也没有额外的安全风险。
问题2:层级路径匹配JSON的实现方案
首先强烈不推荐用正则做这个场景的匹配,原因是JSON序列化后的格式不固定:键值对顺序、空格、换行、转义符的差异都会导致正则匹配失效,稳定性极差。
正确的做法是先把元素data-tags里的JSON字符串解析为PHP数组,再复用问题1里的层级匹配逻辑即可,示例代码:
// $elementTagsJson 是元素data属性中存储的JSON字符串 $elementTags = json_decode($elementTagsJson, true); // 匹配路径 MainCategory1 > Category2 > Value5 $isMatch = isKeywordValid('MainCategory1 > Category2 > Value5', $elementTags);
如果你一定要用正则实现(仅作为原理参考,非常不推荐生产环境使用),可以把路径转成嵌套的JSON结构匹配规则,比如路径MainCategory1 > Category2 > Value5对应的正则pattern是:
/"MainCategory1"\s*:\s*{[^}]*"Category2"\s*:\s*{[^}]*"Value5"\s*:/
该正则局限性非常大:如果JSON里键的顺序反转、中间存在其他同级嵌套数组、键名包含引号/转义符,都会直接匹配失败,完全无法适配生产环境的复杂情况。
内容的提问来源于stack exchange,提问作者Moldevort
相关产品推荐
相关产品推荐

