php - 展平数组 : Keep index, 值等于数组中的位置

标签 php arrays multidimensional-array flatten array-merge

我在尝试以特定方式展平数组时遇到了一些麻烦。

这是我要展平的数组的 print_r View :

Array
    (
        [1] => Array
            (
                [8] => 1
                [9] => 2
                [10] => Array
                    (
                        [15] => Array
                            (
                                [22] => 1
                            )

                        [21] => 2
                    )

                [11] => Array
                    (
                        [16] => Array
                            (
                                [23] => 1
                            )

                    )

            )

        [2] => Array
            (
                [12] => 1
            )

        [3] => Array
            (
                [13] => 1
            )

        [4] => Array
            (
                [14] => 1
            )

        [5] => 5
        [6] => 6
        [7] => 7
    )

我试图创建的是一个保留上述索引的数组,但值等于它在数组中的位置,很像原始索引(从零开始)。

这是期望的结果:

Array
    (
        [1] => 1
        [2] => 2
        [3] => 3
        [4] => 4
        [5] => 5
        [6] => 6
        [7] => 7
        [8] => 1
        [9] => 2
        [10] => 3
        [11] => 4
        [12] => 1
        [13] => 1
        [14] => 1
        [15] => 1
        [16] => 1
        [21] => 2
        [22] => 2
        [23] => 1
    )

据了解,缺少 17 到 20 个。

我的函数如下:

function array_flatten ($array) {
    $result                 = array ();
    $count                  = 1;
    while ($index = current($array)) {
        $result[key($array)] = $count;
        if (is_array($index)) {
            $result = array_merge(array_flatten($index), $result);
        }
        next($array);
        $count++;
    }
    return $result;
}

$result = array_merge(array_flatten($index), $result); 似乎是问题所在。它返回:

Array
(
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
    [7] => 7
)

但是,如果我在同一行运行 var_dump(array_flatten($index));,它将返回所有我希望合并到 $result 变量的数组.

array
  22 => int 1
array
  15 => int 1
  21 => int 2
array
  23 => int 1
array
  16 => int 1
array
  8 => int 1
  9 => int 2
  10 => int 3
  11 => int 4
array
  12 => int 1
array
  13 => int 1
array
  14 => int 1

看起来 array_merge 实际上并没有合并这些数组。

我做错了什么吗?非常感谢任何指导意见。谢谢。

更新

解决了!

完成要求的函数如下:

function array_flatten($array, &$result = array()) {
    $count              = 1;
    foreach($array as $index => $value) {
        $result[$index] = $count;
        if(is_array($value)) {
            array_flatten($value, $result);
        }
        $count++;
    }
    return $result;
}

最佳答案

function flatten_array($array, &$result) {
    foreach($array as $key => $value) {
        if(is_array($value)) {
            flatten_array($value, $result);
        } else {
            $result[$key] = $value;
        }
    }
}

要使用它,请检查下面的示例代码:

$flattened = array();
$test = array(
      1 => 1
    , 3 => 2
    , array(2 => 4, 4 => 6)
    , 5 => 3
    , array(7 => 9, 8 => 7, 9 => 5)
);
flatten_array($test, $flattened);
// Now $flattened contains the flattened array

关于php - 展平数组 : Keep index, 值等于数组中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6711879/

相关文章:

javascript - 如何在div中获取标签内部html?

php - 简单的 mysqli 查询不起作用

php - 当点击网站上的链接时,如何写入 Symfony2 中的数据库?

arrays - 如何将字符数组传递给字符串

c - 多维数组的值为 "skipped"的奇怪错误

C++:将文本文件的内容作为字符串存储到二维数组中(空终止符有问题吗?)

php - 如何使用 PHP 解析带有冒号标记的 XML 节点

javascript - 更改 Javascript 数组内的对象值

PHP SQL : GROUP BY as array index

java - 在 Java 中,是否可以编写单个函数或类来处理任意多维 ArrayList?