PHP如何检查指定值是否存在于二维数组的对应子数组中
错误原因
- 你直接使用
in_array()在白名单的一级数组中做校验,一级数组的元素都是子数组,根本不存在users、kites这类字符串值,所以两个判断都返回不存在。 - 你的白名单数组本身结构不统一:
table是一级关联键,但是column被包在了一个索引为0的子数组里,正常应该统一把参数名作为一级键,方便后续校验。
修复方案
推荐方案:先统一白名单结构(最易维护)
先把白名单改成统一的关联数组结构,参数名作为一级键,对应允许的值作为子数组,直接取对应键的子数组做校验即可:
// 修正后结构统一的白名单 $query_string_params_and_values_white_list = [ 'table' => ['users', 'members'], 'column' => ['keyword', 'phrase'] ]; $table = 'users'; $column = 'kites'; // 校验table值 if (isset($query_string_params_and_values_white_list['table']) && in_array($table, $query_string_params_and_values_white_list['table'])) { echo 'exists'; } else { echo 'no exists'; } // 校验column值 if (isset($query_string_params_and_values_white_list['column']) && in_array($column, $query_string_params_and_values_white_list['column'])) { echo 'exists'; } else { echo 'no exists'; }
运行后输出结果为exists、no exists,完全符合预期。
兼容原有混乱结构的方案
如果无法修改白名单的原有结构,可以写一个通用递归函数遍历所有层级的子数组判断值是否存在:
$query_string_params_and_values_white_list = array('table'=>array('users','members'),array('column'=>array('keyword','phrase'))); $table = 'users'; $column = 'kites'; // 递归检查值是否存在于数组任意层级 function recursive_in_array($needle, $haystack) { foreach ($haystack as $item) { if (is_array($item)) { if (recursive_in_array($needle, $item)) { return true; } } else { if ($item === $needle) { return true; } } } return false; } // 校验table echo recursive_in_array($table, $query_string_params_and_values_white_list) ? 'exists' : 'no exists'; // 校验column echo recursive_in_array($column, $query_string_params_and_values_white_list) ? 'exists' : 'no exists';
内容的提问来源于stack exchange,提问作者Nut Cracking Dude
相关产品推荐
相关产品推荐

