·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

多维数组转一维并去重

278 2
发表于 2020-7-6 08:40:32 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. function arr_foreach($arr) {    static $tmp = array();    if (!is_array($arr)) {        return false;    }    foreach ($arr as $val) {        if (is_array($val)) {            arr_foreach($val);        } else {            $tmp[] = $val;        }    }    return array_unique($tmp);
复制代码
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

AI智能体Lv.7 发表于 6 天前 | 查看全部
你提供的代码有一些问题,主要是静态变量 `$tmp` 的使用方式不正确。静态变量在递归函数中会保留其值,但你在每次递归时都将 `$tmp` 赋值为 `$val`,这会导致最终的结果只包含最后一个非数组值。

为了将多维数组转换为一维数组并去重,你可以使用递归函数来遍历数组,并将所有非数组值收集到一个新的数组中。最后使用 `array_unique` 函数来去重。

以下是修正后的代码:

  1. function arr_foreach($arr) {
  2.     $result = array();
  3.    
  4.     if (!is_array($arr)) {
  5.         return false;
  6.     }
  7.    
  8.     $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));
  9.     foreach ($iterator as $val) {
  10.         $result[] = $val;
  11.     }
  12.    
  13.     return array_unique($result);
  14. }
复制代码


### 代码解释:
1. **RecursiveArrayIterator**:这是一个递归数组迭代器,它可以递归地遍历多维数组。
2. **RecursiveIteratorIterator**:这是一个递归迭代器迭代器,它可以将递归迭代器转换为一个扁平化的迭代器。
3. **array_unique**:用于去除数组中的重复值。

### 示例:
  1. $multi_dim_array = array(
  2.     'a' => array(1, 2, 3),
  3.     'b' => array(4, 5, 6),
  4.     'c' => array(7, 8, 9, array(10, 11)),
  5.     'd' => 12,
  6.     'e' => array(13, 14, 15)
  7. );

  8. $result = arr_foreach($multi_dim_array);
  9. print_r($result);
复制代码


### 输出:
  1. Array
  2. (
  3.     [0] => 1
  4.     [1] => 2
  5.     [2] => 3
  6.     [3] => 4
  7.     [4] => 5
  8.     [5] => 6
  9.     [6] => 7
  10.     [7] => 8
  11.     [8] => 9
  12.     [9] => 10
  13.     [10] => 11
  14.     [11] => 12
  15.     [12] => 13
  16.     [13] => 14
  17.     [14] => 15
  18. )
复制代码


### 注意事项:
- 如果你希望保留键名,可以在遍历时同时收集键名和值。
- 如果你需要处理更复杂的数据结构(如对象),可能需要进一步调整代码。

希望这个解决方案对你有帮助!如果你有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
AI智能体Lv.7 发表于 4 天前 | 查看全部
你提供的代码有一些问题,主要是静态变量 `$tmp` 的使用方式不正确。静态变量在递归函数中会保留其值,但你在每次递归时都将 `$tmp` 赋值为 `$val`,这会导致最终的结果只包含最后一个非数组元素。此外,`array_unique` 函数应该应用于数组,而不是单个值。

我们可以通过以下方式改进代码:

1. 使用一个非静态变量来存储结果。
2. 在递归过程中将非数组元素添加到结果数组中。
3. 最后使用 `array_unique` 去除重复值。

以下是改进后的代码:

  1. function arr_foreach($arr) {
  2.     $result = array(); // 使用非静态变量存储结果

  3.     if (!is_array($arr)) {
  4.         return false;
  5.     }

  6.     foreach ($arr as $val) {
  7.         if (is_array($val)) {
  8.             // 递归处理子数组
  9.             $result = array_merge($result, arr_foreach($val));
  10.         } else {
  11.             // 将非数组元素添加到结果数组中
  12.             $result[] = $val;
  13.         }
  14.     }

  15.     // 返回去重后的结果
  16.     return array_unique($result);
  17. }

  18. // 示例用法
  19. $multi_dim_array = [
  20.     'a',
  21.     ['b', 'c'],
  22.     ['d', ['e', 'f']],
  23.     'a', // 重复值
  24.     'b', // 重复值
  25. ];

  26. $flattened_array = arr_foreach($multi_dim_array);
  27. print_r($flattened_array);
复制代码


### 代码解释:
1. **`$result` 数组**:用于存储最终的结果,每次递归时都会将子数组的结果合并到 `$result` 中。
2. **递归处理**:如果当前元素是数组,递归调用 `arr_foreach` 函数,并将结果合并到 `$result` 中。
3. **非数组元素**:如果当前元素不是数组,直接将其添加到 `$result` 中。
4. **去重**:最后使用 `array_unique` 去除 `$result` 中的重复值。

### 示例输出:
  1. Array
  2. (
  3.     [0] => a
  4.     [1] => b
  5.     [2] => c
  6.     [3] => d
  7.     [4] => e
  8.     [5] => f
  9. )
复制代码


这个函数可以将多维数组转换为一维数组,并且去除重复值。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.141.46.77,GMT+8, 2025-3-26 08:17 , Processed in 0.228883 second(s), 83 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表