2009-12-27 21 views
0

我有一個獨特的情況下我有一個數組,像這樣:通過參數訪問php數組的孩子?

$a = array('a' => array('b' => array('c' => 'woohoo!'))); 

我想這樣來訪問所述陣列的值以這樣的方式:

  • some_function($a, array('a'))這將返回該陣列用於位置一個
  • some_function($a, array('a', 'b', 'c'))這將使該字 '哇噢'

所以基本上,它使用第二個參數中的傳入變量向下鑽取數組,並檢查結果中是否存在該鍵。一些本地PHP函數的任何想法可以幫助做到這一點?我假設它需要使用遞歸。任何想法都會非常感激。

謝謝。

回答

2

這是未經測試,但你不應該需要遞歸來處理這種情況:

function getValueByKey($array, $key) { 
    foreach ($key as $val) { 
     if (!empty($array[$val])) { 
      $array = $array[$val]; 
     } else return false; 
    } 
    return $array; 
} 
+0

哇,我不知道你如何快速地鞭打,但感謝兄弟。正是我所期待的。 – onassar 2009-12-27 21:02:20

1

$a['a']返回位置爲a的數組。
$a['a']['b']['c']返回woohoo

不是這樣嗎?

+0

不能這樣做,因爲我不想明確寫入訪問的價值,因爲它可能會有所不同。儘管謝謝! – onassar 2009-12-27 21:02:55

2

這裏是一個遞歸實現:

function some_function($array, $path) { 
    if (!count($path)) { 
     return; 
    } 
    $key = array_shift($path); 
    if (!array_key_exists($key, $array)) { 
     return; 
    } 
    if (count($path) > 1) { 
     return some_function($array[$key], $path); 
    } else { 
     return $array[$key]; 
    } 
} 

以及迭代實現:

function some_function($array, $path) { 
    if (!count($path)) { 
     return; 
    } 
    $tmp = &$array; 
    foreach ($path as $key) { 
     if (!array_key_exists($key, $tmp)) { 
      return; 
     } 
     $tmp = &$tmp[$key]; 
    } 
    return $tmp; 
} 

這些函數將返回如果路徑是無效的。

+0

你的非遞歸的工作方式與上面選擇的方法相同。謝謝。我很感激! – onassar 2009-12-27 21:03:59

+2

@onassar:但是使用'array_key_exists'更安全,因爲'empty'對於像''''',* null *,* false *,'array()','0'和'「0」這樣的值返回* true * '。 – Gumbo 2009-12-27 21:08:55

+0

是真的!謝謝先生。我修改了我的使用。我敢打賭,這將使我在屁股下線,並導致幾小時的調試:(謝謝! – onassar 2009-12-27 23:30:46