Flatten Array:保持索引,值等于数组中的位置

Posted

技术标签:

【中文标题】Flatten Array:保持索引,值等于数组中的位置【英文标题】:Flatten Array: Keep index, value equal to position in array 【发布时间】:2011-10-06 09:56:31 【问题描述】:

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

这是我想要展平的数组的print_r 视图:

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;

【问题讨论】:

如何在您想要的结果中将 4 变成 4 ([4] => 4)?并且请将您的问题降到最低限度,否则会不必要地难以理解和回答。 @hakre - 似乎 [4]=>4 因为最外面的数组有 7 个元素,第 4 个有索引“4”,@Aleks - 你提到了 array_merge,但我在你的代码在任何地方。 @Aleks - 另外,如果您提供一些代码来定义您的测试数组,这可能会有所帮助。 @timdev - 抱歉,array_flatten(array_flatten($index), $result); 应该是 array_merge(array_flatten($index), $result); @timdev:这些数组问题需要print_r converter。 【参考方案1】:
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

【讨论】:

有效!但是,它会引发以下错误:警告:array_flatten() 缺少参数 2,在第 11 行的 C:/file/update.php 中调用并在第 58 行的 C:/file/update.php 中定义。第 58 行是函数定义,即function flatten_array($array, &$result). 解决了。 function flatten_array($array, &$result = array()) ;) 再次感谢。 如果你想使用展平的数组(并且你想这样做,否则你不会费心去展平它)你需要第二个参数的值。因此,您需要获取一个空数组并将其作为第二个参数分配给函数。我会更新答案以解释我的意思。 能否将4 => 6 替换为14 => 6,然后测试元素4 是否返回?我认为那个漏掉了。 我只能引用:"@hakre - 似乎 [4]=>4 因为最外面的数组有 7 个元素,第 4 个有索引“4” [... ] – timdev 3 hours ago" 与有问题的原始数据进行比较。但是离开它。 ;)【参考方案2】:

在你澄清你的问题后,我有点惊讶你接受了一个没有返回你期望的数据的答案。 (我现在看到您为您的问题添加了您的解决方案。)

我做了什么:我以@Arjan 的函数为基础,在问题输入数据上运行它,并将其与问题预期数据进行比较。然后我做了一点。这就是我想出的(结果):

#   COMP  EXPECTED         . ACTUAL
#00:  ==  Array            . Array
#01:  ==  (                . (
#02:  ==      [1] => 1     .     [1] => 1
#03:  ==      [2] => 2     .     [2] => 2
#04:  ==      [3] => 3     .     [3] => 3
#05:  ==      [4] => 4     .     [4] => 4
#06:  ==      [5] => 5     .     [5] => 5
#07:  ==      [6] => 6     .     [6] => 6
#08:  ==      [7] => 7     .     [7] => 7
#09:  ==      [8] => 1     .     [8] => 1
#10:  ==      [9] => 2     .     [9] => 2
#11:  ==      [10] => 3    .     [10] => 3
#12:  ==      [11] => 4    .     [11] => 4
#13:  ==      [12] => 1    .     [12] => 1
#14:  ==      [13] => 1    .     [13] => 1
#15:  ==      [14] => 1    .     [14] => 1
#16:  ==      [15] => 1    .     [15] => 1
#17:  ==      [16] => 1    .     [16] => 1
#18:  ==      [21] => 2    .     [21] => 2
#19:  !=      [22] => 2    .     [22] => 1
#20:  ==      [23] => 1    .     [23] => 1
#21:  ==  )                . )
#22:  ==                   . 

您的预期数据似乎对位置 22 有错误。

这是修改后的函数(Demo):

function flatten_array($array, &$result = null) 
    $r = null === $result;
    $i = 0;
    foreach($array as $key => $value) 
        $i++;
        if(is_array($value)) 
            $result[$key] = $i;
            flatten_array($value, $result);
         else 
            $result[$key] = $value;
        
    
    if ($r) 
        ksort($result);
        return $result;
    


$actual = flatten_array($input);

【讨论】:

以上是关于Flatten Array:保持索引,值等于数组中的位置的主要内容,如果未能解决你的问题,请参考以下文章

php PHP array_flatten()函数。将多维数组转换为一维数组。

当 $.each 和 array.splice(i) 保持在一起时,JQuery 处理数组超出索引错误

手写一个JS函数,实现数组扁平化Array Flatten

Python当中的array数组对象

比 O(n) 更快地获取数组元素的索引

在 Dremio 查询中使用 FLATTEN 时,有没有办法包含元素索引?