拼合阵列:保持指数值等于阵列位置 [英] Flatten Array: Keep index, value equal to position in array

查看:190
本文介绍了拼合阵列:保持指数值等于阵列位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直有一个小麻烦试图拉平阵列以特定的方式。

下面是数组的的print_r 视图我要扁平化:

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

我正在试图创建是这使上述指标​​的阵列,但值等于它的阵列中的位置,就像(从零开始)原始索引。

下面是所期望的结果:

 阵列
    (
        [1] => 1
        [2] => 2
        [3] => 3
        [4] => 4
        [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人失踪。

我的功能如下:

 函数array_flatten($数组){
    $结果=阵列();
    $计数= 1;
    而($指数=电流($阵列)){
        $结果[关键($数组)] = $计数;
        如果(is_array($指数)){
            $结果= array_merge(array_flatten($指​​数),$结果);
        }
        下一个($数组);
        $计数++;
    }
    返回$结果;
}

$结果= array_merge(array_flatten($指​​数),$结果); 似乎是问题。它返回:

 阵列

    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] =>五
    [6] => 6
    [7] => 7

但是,如果我跑的var_dump(array_flatten($指​​数)); 在同一行,它返回所有我想合并到<$ C $阵列C> $结果变量。

 阵列
  22 =&GT; INT 1
排列
  15 =&GT; INT 1
  21 =&GT; INT 2
排列
  23 =&GT; INT 1
排列
  16 =&GT; INT 1
排列
  8 =&GT; INT 1
  9 =&GT; INT 2
  10 =&GT; INT 3
  11 =&GT; INT 4
排列
  12 =&GT; INT 1
排列
  13 =&GT; INT 1
排列
  14 =&GT; INT 1

似乎是 array_merge 实际上并没有合并这些阵列。

有什么我做错了吗?指导的任何话都非常AP preciated。谢谢你。

更新

解决了!

其中没有所需的功能如下:

 函数array_flatten($阵列,放大器和; $结果=阵列()){
    $计数= 1;
    的foreach($数组作为$指数=&GT; $值){
        $结果[$指数] = $计数;
        如果(is_array($值)){
            array_flatten(价值$,$结果);
        }
        $计数++;
    }
    返回$结果;
}


解决方案

 函数flatten_array($阵列,放大器和; $结果){
    的foreach($数组$关键=&GT; $值){
        如果(is_array($值)){
            flatten_array(价值$,$结果);
        }其他{
            $结果[$关键] = $价值;
        }
    }
}

要使用此功能,请检查下面的示例code:

  $扁平=阵列();
$测试=阵列(
      1 =&GT; 1
    ,3 =&GT; 2
    ,阵列(2 =→4,4 =→6)
    ,5 =&GT; 3
    ,阵列(7 = GT; 9,8 =大于7,9 =大于5)
);
flatten_array($测试,$扁平);
//现在$扁平包含平面数组

I've been having a little trouble trying to flatten arrays in a specific way.

Here is a print_r view of the array I want to flatten:

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
    )

What I'm attempting to create is an array which keeps the above indexes, but the value is equal to it's position in the array, much like the original index (starting from zero).

Here is the desired result:

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
    )

Knowingly, 17 to 20 are missing.

My function is as follows:

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;
}

The line $result = array_merge(array_flatten($index), $result); appears to be the problems. It returns:

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

However, if I run var_dump(array_flatten($index)); on the same line, it returns all the arrays I wish to merge to the $result variable.

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

It seems that that array_merge doesn't actually merge these arrays.

Is there something I am doing wrong? Any words of guidance are very much appreciated. Thank you.

Update

Solved!

The function which does the required is as follows:

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;
        }
    }
}

To use this, check the sample code below:

$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

这篇关于拼合阵列:保持指数值等于阵列位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆