2012-12-26 129 views
0

我有一個數組,其中包含path到另一個數組中的特定值,使其更清晰一些,這裏是一個例子。包含鍵和關聯數組的數組,如何創建關係

我含我稱之爲$鍵數組PARAMS

Array 
(
    [0] => paths 
    [1] => assets 
    [2] => js 
) 

這裏是我的關聯數組,我會打電話給$配置

Array 
(
    [paths] => Array 
     (
      [assets] => Array 
       (
        [js] => /assets/js 
        [css] => /assets/css 
       ) 

     ) 

    [library] => Array 
     (
      [js] => jQuery 
     ) 

) 

所以我怎麼會用我的數組1來訪問我的數組2中的值?我試過$config[$params[0]][$params[1]][$params[2]],但它效率不高。

回答

3

您可以嘗試

$path = array(
     0 => 'paths', 
     1 => 'assets', 
     2 => 'js', 
); 


$data = array(
    'paths' => array(
    'assets' => array(
     'js' => '/assets/js', 
     'css' => '/assets/css', 
    ), 
), 
    'library' => array(
    'js' => 'jQuery', 
), 
); 


$temp = $data; 
foreach($path as $key) { 
    $temp = $temp[$key]; 
} 

var_dump($temp); 

輸出

string '/assets/js' (length=10) 
+0

你不覆蓋'$ data'陣列,每次的值賦給'$ temp'參考(哪個指向$ data)? – knittl

+0

@ knittl沒有我沒有...看到http://eval.in/5365 – Baba

+0

光和工作,謝謝 –

1

嗨喬納森在這裏,你已經錯過了一個撐到底 試試這個「$配置[$ PARAMS [0] [$ PARAMS [ 1]] [$ PARAMS [2]]」。 它將工作 我張貼這對我來說工作得很好代碼

<?php 
$params = array(0 => 'paths',1 => 'assets',2 => 'js'); 
echo '<pre>';print_r($params); 

$config = array 
(
    'paths' => array 
     (
      'assets' => array 
       (
        'js' => '/assets/js', 
        'css' => '/assets/css' 
       ) 

     ), 

    'library' => array 
     (
      'js' => 'jQuery' 
     ) 

); 
echo '<pre>';print_r($config); 
echo $config[$params[0]][$params[1]][$params[2]]; 
?> 
2

環路應該解決您的問題:

$c = $config; 
foreach($params as $path) { 
    if(!array_key_exists($path, $c)) { 
    $c = null; 
    break; 
    } 
    $c = $c[$path]; 
} 

這將每個條目遍歷在$params,然後訪問的子項$config陣列。找到它後,$c將包含當前的子數組。最後,$c將包含您正在查找的值(如果路徑無效/未找到,則爲NULL)。

同樣可以在一個功能性的方式使用array_reduce函數來完成:

$path = array_reduce(function($current, $path) { 
    if($current == NULL || !array_key_exists($path, $current)) 
    return NULL; 

    return $current[$path]; 
}, $params, $config);