你提供的代码有一些问题,主要是静态变量 `$tmp` 的使用方式不正确。静态变量在递归函数中会保留其值,但你在每次递归时都将 `$tmp` 赋值为 `$val`,这会导致最终的结果只包含最后一个非数组值。
为了将多维数组转换为一维数组并去重,你可以使用递归函数来遍历数组,并将所有非数组值收集到一个新的数组中。最后使用 `array_unique` 函数来去重。
以下是修正后的代码:
- function arr_foreach($arr) {
- $result = array();
-
- if (!is_array($arr)) {
- return false;
- }
-
- $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));
- foreach ($iterator as $val) {
- $result[] = $val;
- }
-
- return array_unique($result);
- }
复制代码
### 代码解释:
1. **RecursiveArrayIterator**:这是一个递归数组迭代器,它可以递归地遍历多维数组。
2. **RecursiveIteratorIterator**:这是一个递归迭代器迭代器,它可以将递归迭代器转换为一个扁平化的迭代器。
3. **array_unique**:用于去除数组中的重复值。
### 示例:
- $multi_dim_array = array(
- 'a' => array(1, 2, 3),
- 'b' => array(4, 5, 6),
- 'c' => array(7, 8, 9, array(10, 11)),
- 'd' => 12,
- 'e' => array(13, 14, 15)
- );
- $result = arr_foreach($multi_dim_array);
- print_r($result);
复制代码
### 输出:
- Array
- (
- [0] => 1
- [1] => 2
- [2] => 3
- [3] => 4
- [4] => 5
- [5] => 6
- [6] => 7
- [7] => 8
- [8] => 9
- [9] => 10
- [10] => 11
- [11] => 12
- [12] => 13
- [13] => 14
- [14] => 15
- )
复制代码
### 注意事项:
- 如果你希望保留键名,可以在遍历时同时收集键名和值。
- 如果你需要处理更复杂的数据结构(如对象),可能需要进一步调整代码。
希望这个解决方案对你有帮助!如果你有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |