关于父子分类一些处理 发布于 2025 年 8 月 10 日 全文约 1,074 字 · 预计阅读 4 分钟 #### 实际问题:小程序分类页面到查询页面的跳转  > 搜索页面要展示两级分类,一级分类和二级分类,当点击一级分类的时候需要展示当前一级分类下的所有二级分类,这个时候需要设置一个一级分类指向二级分类的数组。 > 但是当从分类页面(携带二级分类ID)跳转到搜索页面的时候,需要展示一级、二级分类,这时候就需要一个二级分类指向一级分类的数组。 > 所以当跳转到搜索页面的时候会请求接口,返回两块内容,一个是一级分类指向二级分类的数组,另一个是二级分类指向一级分类的数组。 ``` { "data": { "book_category_list": { "all": { "id": "all", "name": "全部", "child": [] }, "22728aaa": { "id": "22728aaa", "name": "男生", "child": [ { "id": "all", "name": "全部" }, { "id": "227289d6", "name": "玄幻" }, { "id": "22728a21", "name": "奇幻" }, { "id": "22728a41", "name": "修真" }, { "id": "22728a4a", "name": "仙侠" }, { "id": "22728a54", "name": "武侠" }, { "id": "22728a9c", "name": "科幻" } ] }, "22728aab": { "id": "22728aab", "name": "女生", "child": [ { "id": "all", "name": "全部" }, { "id": "22728a2d", "name": "都市" }, { "id": "22728a38", "name": "女频" }, { "id": "22728a5c", "name": "言情" }, { "id": "22728a78", "name": "穿越" }, { "id": "22728a81", "name": "网游" } ] }, "22728aac": { "id": "22728aac", "name": "其他", "child": [ { "id": "all", "name": "全部" }, { "id": "22728a12", "name": "同人" }, { "id": "22728a65", "name": "历史" }, { "id": "22728a6f", "name": "灵异" }, { "id": "22728a8a", "name": "竞技" }, { "id": "22728a93", "name": "动漫" }, { "id": "22728aa4", "name": "其他" } ] } }, "book_category_2_to_1": { "227289d6": "22728aaa", "22728a21": "22728aaa", "22728a41": "22728aaa", "22728a4a": "22728aaa", "22728a54": "22728aaa", "22728a9c": "22728aaa", "22728a2d": "22728aab", "22728a38": "22728aab", "22728a5c": "22728aab", "22728a78": "22728aab", "22728a81": "22728aab", "22728a12": "22728aac", "22728a65": "22728aac", "22728a6f": "22728aac", "22728a8a": "22728aac", "22728a93": "22728aac", "22728aa4": "22728aac" } } } ``` 多维数组深度融合 * **1.初级方案** **思路:** * 1. 定义两个个空数组 $result1=[];$result2=[]; * 2. 把多维数组的每一级 key,根据指定的 连接字符串 串联起来,当作新数组 的 key。并把多维数组最终指向的值当作新数组[数组 的 key] 的值 * 3. 把两个数组合并,$result1会覆盖$result2,得到最终的$result * 4. 把$result一维数组,恢复成多维数组,利用的是php 中的引用&(很强大) ``` $user_config = [ 'header' => [ 'font-size' => '24', 'color' => 'red' ], 'body' => [ 'background-color' => 'white', 'article-font-size' => '20', 'article-display' => 'NO', ] ]; $default_config = [ 'header' => [ 'font-size' => '16', 'color' => '#cccccc' ], 'body' => [ 'background-color' => 'white', 'article-font-size' => '18', 'article-display' => 'YES', ], 'footer' => [ 'tips' => '当前网站只用于学习使用' ] ]; class ArrKey { /** * @var string 各级 key 连接符号 */ private static $split_str = '<<>>'; /** * 多维数组把多维数组,根据各级 key “压实” 为一维数组:主函数 * @param $init_array * @return array */ private static function compactArrayByKey($init_array) { $result = []; static::compactArrayByKeyItem($init_array, '', $result); return $result; } /** * 多维数组把多维数组,根据各级 key “压实” 为一维数组:递归调用 * @param $init_array * @param $key * @param $result */ private static function compactArrayByKeyItem($init_array, $key, &$result) { if (!is_array($init_array)) { $result[$key] = $init_array; } else { foreach ($init_array as $tmp_key => $val) { static::compactArrayByKeyItem($val, empty($key) ? $tmp_key : $key . static::$split_str . $tmp_key, $result); } } return; } /** * 把 “压实” 的数组恢复到多维数组 * @param $init_array * @return array */ private static function restoreArrayByKey($init_array) { $result = []; foreach ($init_array as $key => $value) { // 使用分隔符拆分键 $keys = explode(static::$split_str, $key); // 引用指向当前层次数组 $current_array = &$result; // 迭代键并创建多维数组 foreach ($keys as $subKey) { // 如果键不存在,则创建一个新的数组 if (!isset($current_array[$subKey])) { $current_array[$subKey] = []; } // 引用指向下一层次数组 $current_array = &$current_array[$subKey]; } // 在最终的数组位置设置值 $current_array = $value; } return $result; } /** * 根据 key,合并 “压实” 的数组 * @param $compact_top_array * @param $compact_base_array * @return array */ private static function ArrayMergeByKeyStr($compact_top_array, $compact_base_array) { $result = []; foreach ($compact_base_array as $key => $value) { if (isset($compact_top_array[$key])) { $result[$key] = $compact_top_array[$key]; } else { $result[$key] = $value; } } return $result; } /** * 合并两个多维数组,第一个数组会把第二个数组对应的值覆盖掉 * 场景: * 网站默认设置、用户自定义设置:用户的设置会覆盖掉默认设置,如果用户要恢复默认设置,则会把用户设置数组清空 * @param $top_array * @param $base_array * @return array */ public static function buildMultiDimArrayMerge($top_array, $base_array) { $compact_top_array = ArrKey::compactArrayByKey($top_array); $compact_base_array = ArrKey::compactArrayByKey($base_array); $compact_result_array = static::ArrayMergeByKeyStr($compact_top_array, $compact_base_array); return static::restoreArrayByKey($compact_result_array); } } // 多维数组深度融合 $result = ArrKey::buildMultiDimArrayMerge($user_config, $default_config); var_dump($result); ``` * **2.最终方案** ``` function array_merge_recursive_distinct(array &$array1, array &$array2) { $merged = $array1; foreach ($array2 as $key => &$value) { if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) { $merged[$key] = array_merge_recursive_distinct($merged[$key], $value); } else { $merged[$key] = $value; } } return $merged; } ``` 关于父子分类一些处理 https://blog.gamehomexx.asia/index.php/archives/83/ 无责任编辑 joewang 发布时间 2025 年 8 月 10 日 最后编辑时间 2025 年 8 月 10 日 版权协议 CC BY-NC-SA 4.0 递归分类问题 广告 广告位招租 联系站长投放广告 了解更多 → 分享 文章目录 × 关于父子分类一些处理 ← 上一篇Yum换源 下一篇 →关于小程序开发的一些基础知识 发表评论 取消回复 提交评论 评论 暂无评论
#### 实际问题:小程序分类页面到查询页面的跳转  > 搜索页面要展示两级分类,一级分类和二级分类,当点击一级分类的时候需要展示当前一级分类下的所有二级分类,这个时候需要设置一个一级分类指向二级分类的数组。 > 但是当从分类页面(携带二级分类ID)跳转到搜索页面的时候,需要展示一级、二级分类,这时候就需要一个二级分类指向一级分类的数组。 > 所以当跳转到搜索页面的时候会请求接口,返回两块内容,一个是一级分类指向二级分类的数组,另一个是二级分类指向一级分类的数组。 ``` { "data": { "book_category_list": { "all": { "id": "all", "name": "全部", "child": [] }, "22728aaa": { "id": "22728aaa", "name": "男生", "child": [ { "id": "all", "name": "全部" }, { "id": "227289d6", "name": "玄幻" }, { "id": "22728a21", "name": "奇幻" }, { "id": "22728a41", "name": "修真" }, { "id": "22728a4a", "name": "仙侠" }, { "id": "22728a54", "name": "武侠" }, { "id": "22728a9c", "name": "科幻" } ] }, "22728aab": { "id": "22728aab", "name": "女生", "child": [ { "id": "all", "name": "全部" }, { "id": "22728a2d", "name": "都市" }, { "id": "22728a38", "name": "女频" }, { "id": "22728a5c", "name": "言情" }, { "id": "22728a78", "name": "穿越" }, { "id": "22728a81", "name": "网游" } ] }, "22728aac": { "id": "22728aac", "name": "其他", "child": [ { "id": "all", "name": "全部" }, { "id": "22728a12", "name": "同人" }, { "id": "22728a65", "name": "历史" }, { "id": "22728a6f", "name": "灵异" }, { "id": "22728a8a", "name": "竞技" }, { "id": "22728a93", "name": "动漫" }, { "id": "22728aa4", "name": "其他" } ] } }, "book_category_2_to_1": { "227289d6": "22728aaa", "22728a21": "22728aaa", "22728a41": "22728aaa", "22728a4a": "22728aaa", "22728a54": "22728aaa", "22728a9c": "22728aaa", "22728a2d": "22728aab", "22728a38": "22728aab", "22728a5c": "22728aab", "22728a78": "22728aab", "22728a81": "22728aab", "22728a12": "22728aac", "22728a65": "22728aac", "22728a6f": "22728aac", "22728a8a": "22728aac", "22728a93": "22728aac", "22728aa4": "22728aac" } } } ``` 多维数组深度融合 * **1.初级方案** **思路:** * 1. 定义两个个空数组 $result1=[];$result2=[]; * 2. 把多维数组的每一级 key,根据指定的 连接字符串 串联起来,当作新数组 的 key。并把多维数组最终指向的值当作新数组[数组 的 key] 的值 * 3. 把两个数组合并,$result1会覆盖$result2,得到最终的$result * 4. 把$result一维数组,恢复成多维数组,利用的是php 中的引用&(很强大) ``` $user_config = [ 'header' => [ 'font-size' => '24', 'color' => 'red' ], 'body' => [ 'background-color' => 'white', 'article-font-size' => '20', 'article-display' => 'NO', ] ]; $default_config = [ 'header' => [ 'font-size' => '16', 'color' => '#cccccc' ], 'body' => [ 'background-color' => 'white', 'article-font-size' => '18', 'article-display' => 'YES', ], 'footer' => [ 'tips' => '当前网站只用于学习使用' ] ]; class ArrKey { /** * @var string 各级 key 连接符号 */ private static $split_str = '<<>>'; /** * 多维数组把多维数组,根据各级 key “压实” 为一维数组:主函数 * @param $init_array * @return array */ private static function compactArrayByKey($init_array) { $result = []; static::compactArrayByKeyItem($init_array, '', $result); return $result; } /** * 多维数组把多维数组,根据各级 key “压实” 为一维数组:递归调用 * @param $init_array * @param $key * @param $result */ private static function compactArrayByKeyItem($init_array, $key, &$result) { if (!is_array($init_array)) { $result[$key] = $init_array; } else { foreach ($init_array as $tmp_key => $val) { static::compactArrayByKeyItem($val, empty($key) ? $tmp_key : $key . static::$split_str . $tmp_key, $result); } } return; } /** * 把 “压实” 的数组恢复到多维数组 * @param $init_array * @return array */ private static function restoreArrayByKey($init_array) { $result = []; foreach ($init_array as $key => $value) { // 使用分隔符拆分键 $keys = explode(static::$split_str, $key); // 引用指向当前层次数组 $current_array = &$result; // 迭代键并创建多维数组 foreach ($keys as $subKey) { // 如果键不存在,则创建一个新的数组 if (!isset($current_array[$subKey])) { $current_array[$subKey] = []; } // 引用指向下一层次数组 $current_array = &$current_array[$subKey]; } // 在最终的数组位置设置值 $current_array = $value; } return $result; } /** * 根据 key,合并 “压实” 的数组 * @param $compact_top_array * @param $compact_base_array * @return array */ private static function ArrayMergeByKeyStr($compact_top_array, $compact_base_array) { $result = []; foreach ($compact_base_array as $key => $value) { if (isset($compact_top_array[$key])) { $result[$key] = $compact_top_array[$key]; } else { $result[$key] = $value; } } return $result; } /** * 合并两个多维数组,第一个数组会把第二个数组对应的值覆盖掉 * 场景: * 网站默认设置、用户自定义设置:用户的设置会覆盖掉默认设置,如果用户要恢复默认设置,则会把用户设置数组清空 * @param $top_array * @param $base_array * @return array */ public static function buildMultiDimArrayMerge($top_array, $base_array) { $compact_top_array = ArrKey::compactArrayByKey($top_array); $compact_base_array = ArrKey::compactArrayByKey($base_array); $compact_result_array = static::ArrayMergeByKeyStr($compact_top_array, $compact_base_array); return static::restoreArrayByKey($compact_result_array); } } // 多维数组深度融合 $result = ArrKey::buildMultiDimArrayMerge($user_config, $default_config); var_dump($result); ``` * **2.最终方案** ``` function array_merge_recursive_distinct(array &$array1, array &$array2) { $merged = $array1; foreach ($array2 as $key => &$value) { if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) { $merged[$key] = array_merge_recursive_distinct($merged[$key], $value); } else { $merged[$key] = $value; } } return $merged; } ```
评论 暂无评论