如何遍历多维数组,对匹配键的元素应用类型转换回调函数?
如何根据类型转换规则数组处理多维数据数组?
首先明确两个核心数组:
原始数据数组
$data = [ "workflowStep" => null, "penalty" => 0.0, "order" => 0, "readMode" => true, "applyPenaltyTo101Only" => false, "writeMode" => true, "transMemory" => [ 'uid' => 'FS#GEHED', 'items' => 12, ], "targetLocale" => "en_us", ];
类型转换规则数组
$rules = [ "penalty" => 'float', "readMode" => 'bool', "transMemory" => [ 'uid' => 'string', 'items' => 'int', ], ];
实现思路
因为数组是多维嵌套结构,需要递归遍历处理层级数据:只处理规则数组中存在对应键的元素,遇到嵌套规则时递归处理子数组,最终根据规则对值执行类型转换。
具体代码实现
function applyTypeConversion(&$data, $rules) { foreach ($rules as $key => $rule) { // 跳过数据中不存在的键 if (!isset($data[$key])) { continue; } // 递归处理嵌套的子数组规则 if (is_array($rule)) { applyTypeConversion($data[$key], $rule); continue; } // 按规则执行类型转换 switch ($rule) { case 'int': $data[$key] = (int)$data[$key]; break; case 'float': $data[$key] = (float)$data[$key]; break; case 'bool': $data[$key] = (bool)$data[$key]; break; case 'string': $data[$key] = (string)$data[$key]; break; // 可根据需求扩展其他类型转换(如array、null等) } } } // 调用函数直接修改原数据数组 applyTypeConversion($data, $rules); // 查看处理后的结果 print_r($data);
代码说明
- 使用引用传递
&$data,直接修改原数组,无需额外返回值; - 仅遍历规则数组的键,只处理数据中存在对应键的元素,避免无意义操作;
- 针对嵌套的规则数组,递归调用函数处理子层级数据;
- 通过
switch分支处理不同类型的强制转换,可按需扩展更多类型支持。
内容的提问来源于stack exchange,提问作者Collin Ter Steege
相关产品推荐
相关产品推荐

