2
$json = '[
    {
        "class1":
        {
            "function1":"return \"$a<b>$b</b>!\";"
        }
    },
    {
        "class2":
        {
            "function2":"return $b;",
            "function3":"return $c;"
        }
    }
]';
$decoded_classes = json_decode($json,true);
foreach($decoded_classes as $class)
{
    $class_name = key($class);
    if (is_array($class[$class_name]))
    {
        foreach($class[$class_name] as $function)
        {
            $function_name = key($class[$class_name]);
            $stack[$class_name][$function_name] = create_function($arr,$function);
        }
    } 
    else 
    {
        foreach($class as $function)
        {
            $c_name = key($class);
            $stack[$c_name] = create_function($arr,$function);
        }
    }
}
return $stack;

このコードは同じ結果を実行する必要がありますが、1つだけforeachです。どうやってやるの?

4

1 に答える 1

3

JSONを次のように変換すると...「PHPON」とすると、次のようになります。

$decoded_classes = Array(
    Array(
        "class1"=>Array(
            "function1"=>'return "$a<b>$b</b>!";'
        )
    )
    Array(
        "class2"=>Array(
            "function2"=>'return $b;',
            "function3"=>'return $c;'
        )
    )
);

ご覧のとおり、構造は必ずしも最も効率的ではありません。基本的にレベルが多すぎます。

次のようにJSONを再構築します。

{     
    "class1": {     
        "function1":"return \"$a<b>$b</b>!\";"
    },
    "class2": {     
        "function2":"return $b;",
        "function3":"return $c;"
    }
}

このように、「PHPON」は次のとおりです。

$decoded_classes = Array(
    "class1"=>Array(
        "function1"=>'return "$a<b>$b</b>!";'
    )
    "class2"=>Array(
        "function2"=>'return $b;',
        "function3"=>'return $c;'
    )
);

今、あなたはまったくループする必要さえありません。アクセス$decoded_classes['class1']['function1']すると、そのコードが得られます。あなたがしなければならない唯一のことは、それらの文字列を次のように呼び出し可能な関数に変換することです:

array_walk_recursive($decoded_classes,function(&$f) {$f = create_function($arr,$f);});

$arrコードのどこにも定義されていないことに気づかずにはいられません。$arrこれを機能させるには、正しく指定する必要があります。

于 2012-07-08T18:54:34.667 に答える