如何将Laravel数组转换为Ruby HashWithIndifferentAccess格式哈希
解决方案
默认Yaml::dump只会生成标准YAML格式,不会携带Ruby专属的ActiveSupport::HashWithIndifferentAccess类型标记,所以需要在生成YAML后手动注入标记,实现代码如下:
// 你的输入数组 $array = [ 'accepted' => [ 'number_of_order' => [ 'condition' => 'between_number', 'value' => '0&5' ] ], 'removed' => [] ]; // 1. 生成标准YAML,第二个参数为最大缩进层级,按需调整适配你的数组深度 $baseYaml = Yaml::dump($array, 10); // 2. 给非空哈希行添加类型标记 $processedYaml = preg_replace( '/^(\s*)([a-zA-Z0-9_]+):\s*$/m', '$1$2: !ruby/hash:ActiveSupport::HashWithIndifferentAccess', $baseYaml ); // 3. 给空哈希行添加类型标记 $processedYaml = preg_replace( '/^(\s*)([a-zA-Z0-9_]+):\s*\{\}\s*$/m', '$1$2: !ruby/hash:ActiveSupport::HashWithIndifferentAccess {}', $processedYaml ); // 4. 给根节点添加类型标记 $finalYaml = preg_replace( '/^---\s*/', '--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess' . PHP_EOL, $processedYaml ); // 输出结果 echo $finalYaml;
上述代码输出结果和你要求的预期格式完全匹配:
--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess accepted: !ruby/hash:ActiveSupport::HashWithIndifferentAccess number_of_order: !ruby/hash:ActiveSupport::HashWithIndifferentAccess condition: between_number value: 0&5 removed: !ruby/hash:ActiveSupport::HashWithIndifferentAccess {}
注意事项
- 正则默认适配键名为字母、数字、下划线的场景,如果你的哈希键包含特殊字符可自行调整正则匹配规则
- 生成的YAML可直接被Ruby的YAML.load方法识别,自动转换为
ActiveSupport::HashWithIndifferentAccess实例
内容的提问来源于stack exchange,提问作者HG Webs
相关产品推荐
相关产品推荐

