如何按字符串模式遍历并操作PHP多维关联数组
PHP多维数组按方括号字符串模式读取与更新方案
核心思路
不管是读取还是更新,第一步都是从模式字符串中解析出层级键名列表:通过正则匹配提取所有[]包裹的键值,得到类似['social', 'fb']的层级键数组,再逐层遍历数组操作即可。
问题1:按模式字符串读取对应值
实现代码
/** * 按模式字符串读取多维数组的值 * @param array $array 要操作的目标数组 * @param string $pattern 方括号拼接的模式字符串,如 data[social][fb] * @return mixed 匹配到的值,键不存在返回null */ function get_array_value(array $array, string $pattern) { // 提取所有中括号内的键名 preg_match_all('/\[([^\]]+)\]/', $pattern, $matches); $keys = $matches[1] ?? []; if (empty($keys)) return null; $current = $array; foreach ($keys as $key) { if (!isset($current[$key])) { return null; } $current = $current[$key]; } return $current; }
调用示例
// 测试数组 $data = [ 'store_name' => 'Jota', 'social' => [ 'fb' => 78, 'youtube' => 34, 'twitter' => 97, 'linkedin' => 23, 'pinterest' => 12, 'instagram' => 93, 'flickr' => 45 ] ]; $input = "data[social][fb]"; echo get_array_value($data, $input); // 输出 78
问题2:按模式字符串更新对应值
注意数组参数要加引用符号&,否则修改不会作用到原数组。
实现代码
/** * 按模式字符串更新多维数组的值 * @param array $array 要操作的目标数组(引用传参) * @param string $pattern 方括号拼接的模式字符串,如 data[social][fb] * @param mixed $value 要设置的新值 * @return bool 更新成功返回true */ function update_array(array &$array, string $pattern, $value): bool { // 提取所有中括号内的键名 preg_match_all('/\[([^\]]+)\]/', $pattern, $matches); $keys = $matches[1] ?? []; if (empty($keys)) return false; $current = &$array; // 弹出最后一级键名,先遍历前面的层级 $last_key = array_pop($keys); foreach ($keys as $key) { // 若中间层级不存在,可选择自动创建数组,或者抛出错误/返回false if (!isset($current[$key]) || !is_array($current[$key])) { $current[$key] = []; } $current = &$current[$key]; } // 给最后一级键赋值 $current[$last_key] = $value; return true; }
注:如果要求层级键必须已存在才能更新,删除自动创建数组的逻辑,改为键不存在时直接返回false即可。
调用示例
$pattern = "data[social][fb]"; $value = "foo"; update_array($data, $pattern, $value); echo $data['social']['fb']; // 输出 foo
内容的提问来源于stack exchange,提问作者SkyRar
相关产品推荐
相关产品推荐

