3

特定の方法で配列をフラット化しようとすると、少し問題が発生します。

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

2 に答える 2

2
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
于 2011-07-15T19:10:34.860 に答える
0

質問を明確にした後、期待したデータを返さない回答を受け入れたことに少し驚きました。(あなたがあなたの解決策をあなたの質問に追加したのを見ました。)

私がしたこと: @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);
于 2011-07-16T04:12:17.523 に答える