-1

私を助けてくれたこの投稿を見つけました:文字列を分割して多次元配列キーを形成しますか?

とにかく、それは文字列値に関しては魅力のように機能しますが、配列キーに整数が含まれている場合、これらを見逃します。

デモは次のとおりです。

私は鍵のセットを手に入れました:

Array
(
    [0] => variable_data
    [1] => 0
    [2] => var_type
)

そして、ネストされた配列を作成する方法

function constructArray( &$array_ptr, $keys, $value )
    {
        // extract the last key
        $last_key = array_pop ( $keys );

        // walk/build the array to the specified key
        while ( $arr_key = strval( array_shift ( $keys ) ) )
        {
            if ( !array_key_exists ( strval($arr_key), $array_ptr ) )
            {
                $array_ptr[ strval($arr_key) ] = array ( );
            }
            $array_ptr = &$array_ptr[ strval($arr_key) ];
        }

        // set the final key
        $array_ptr[ $last_key ] = '$value';
    }

そして、私はそれをこのように使用します:

$keys = array(
    'variable_data',
    '0',
    'var_type'
);
    $clean_arr = array();
    constructArray($clean_arr, $keys, 'asd');

しかし、出力は次のようになります。

Array
(
    [variable_data] => Array
        (
            [var_desc] => $value
        )

)

ご覧のとおり、variable_dataインデックスには0インデックスが含まれていません。私は私が働くことを知っているかもしれないほとんどすべてをテストしました、しかしそれはしませんでした。より良い手がかりを持っている人はいますか?

4

1 に答える 1

0

解決

魔法を実行する関数は次のとおりです。

function constructArray( &$array_ptr, $keys, $value )
    {
        // extract the last key
        $last_key = array_pop ( $keys );

        foreach ( $keys as $arr_key )
        {
             unset($keys[$arr_key]);
             if ( !array_key_exists ( strval($arr_key), $array_ptr ) )
            {
                $array_ptr[ strval($arr_key) ] = array ( );
            }
            $array_ptr = &$array_ptr[ strval($arr_key) ];
        }

        // set the final key
        $array_ptr[ $last_key ] = $value;
    }

使用法:

$keys = array('variable_data', '0', 'var_desc');
$clean_arr = array();
constructArray($clean_arr, $keys, 'asd');

// Output
Array
(
    [variable_data] => Array
        (
            [0] => Array
                (
                    [var_desc] => asd
                )

        )

)
于 2012-05-26T11:36:02.617 に答える