2012-07-08 42 views
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; 

我需要這個代碼將執行相同的結果,但只有一個foreach。我怎樣才能做到這一點?如何編寫此代碼以獲得相同的結果,但只有一個foreach語句?

+0

有什麼限制讓你「需要」只用一個'foreach'來完成?你允許使用遞歸嗎? – 2012-07-08 18:30:58

+3

你想達到什麼目的?這很難猜測。 – Lion 2012-07-08 18:31:02

+0

我有一個PHP代碼的數組,我需要轉換爲函數。基本上,代碼將在數組內創建函數並將它們重新設置爲變量 – 2012-07-08 18:35:09

回答

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才能正常工作。

+0

謝謝!我知道了! – 2012-07-08 19:18:49

相關問題