0

これを自分で解決しようとしていますが、理解できる解決策が見つかりません。

この配列は、アプリケーションが動的構成ファイルを読み取ってロードするときにその場で作成されます。

私の問題は、alias取得される配列を呼び出して、その下にある親配列の名前を変更したいということ['@attr']です。これが私が何を意味するかを示す例です。

[database] => Array
        (
            [0] => Array // Would be renamed to "production"
                (
                    [host] => test
                    [user] => test
                    [pass] => test
                    [name] => test
                    [port] => test
                    [@attr] => Array
                        (
                            [alias] => production
                            [name] => live
                        )

                )

            [1] => Array // Would be renamed to "development"
                (
                    [user_data] => Array
                        (
                            [0] => Array // Would be renamed to "three"
                                (
                                    [user] => sample
                                    [@attr] => Array
                                        (
                                            [alias] => three
                                        )

                                )

                            [1] => Array // Would be renamed to "two"
                                (
                                    [user] => sample
                                    [@attr] => Array
                                        (
                                            [alias] => two
                                        )

                                )

                        )

                    [host] => test
                    [user] => test
                    [pass] => test
                    [name] => test
                    [port] => test
                    [@attr] => Array
                        (
                            [alias] => development
                        )

                )

        )

これはこれまでの私のコードです

private function _applyXmlAlias($array)
        {
            foreach ($array as $config)
            {
                if (is_array($config))
                {
                    if (isset($config['@attr']['alias']))
                    {
                        $alias = $config['@attr']['alias'];

                        unset($config['@attr']['alias']);

                        if (empty($config['@attr']))
                        {
                            unset($config['@attr']);
                        }

                        $this->_alias[$alias] = $config;

                        break;

                        //$this->_temp = reset();


                    } else {

                        $this->_applyXmlAlias($config);
                    }
                }
            }
        }

_aliasプロパティの print_r を実行すると、これが得られます

   Array
(
    [production] => Array
        (
            [host] => test
            [user] => test
            [pass] => test
            [name] => test
            [port] => 3306
            [@attr] => Array
                (
                    [name] => live
                )

        )

    [development] => Array
        (
            [user_data] => Array
                (
                    [0] => Array
                        (
                            [user] => sample
                            [@attr] => Array
                                (
                                    [alias] => three
                                )

                        )

                    [1] => Array
                        (
                            [user] => sample
                            [@attr] => Array
                                (
                                    [alias] => two
                                )

                        )

                )

            [host] => test
            [user] => test
            [pass] => test
            [name] => test
            [port] => 3306
        )

)

注: 私のループaliasが、値を持つ他のキーではなく、productionキーを持つ最後のネストされた配列のみをキャプチャする理由がわかりません。development

これにどのようにアプローチできるかについてのアイデアはありますか? 正しい道に少しガイドが必要なだけで、私は近づいていると感じています。

ありがとう

編集:現在の試行を反映するように関数を更新しました

4

2 に答える 2

0

あなたのアルゴリズムは深さ優先検索を行っています。問題は、いつ終了するかわからないことです。

void 戻り型の代わりに、次のようなものを試してください。

    private function _applyXmlAlias($array)
    {
        $found_alias = FALSE;
        foreach ($array as $config)
        {
            if (is_array($config))
            {
                if (isset($config['@attr']['alias']))
                {
                    $this->_alias = reset(array_values($config));
                    $found_alias = TRUE;
                       break;
                } else {
                    if ($this->_applyXmlAlias($config)) {
                       $found_alias = TRUE;
                       break;
                    }
                }
            }
        }
        return $found_alias;
    }
于 2012-08-25T07:16:22.710 に答える
0

おそらく最もエレガントなソリューションではありませんが、機能します。

function renameArr($arr) {
    foreach($arr as $key=>$val) {
        if(is_array($val)) {
            if(isset($val['@attr']['alias'])) {
                unset($arr[$key]);
                $key = $val['@attr']['alias'];
            }
            $arr[$key] = renameArr($val);
        }
    }
    return $arr;
}
于 2012-08-25T07:36:22.243 に答える