2012-10-26 81 views
3

可能重複:
PHP: Use a string as an array index path to retreive a value如何通過路徑訪問多維數組元素?

我有一個數組,像這樣:

$array['image']['comment'] = 'something'; 
$array['image']['tag'] = 'happy'; 
$array['image']['colors']['blue'] = '12345'; 

如果我有一個字符串的路徑的每個元素,我怎樣才能設置或獲取數組值?

e.g其中$path = 'image/colors/blue';下面的函數返回12345

function get_array($array, $path) 
{ 
//what goes here? 
} 

function set_array($array, $path, $value) 
{ 
//what goes here? 
} 
+0

有什麼辦法可以將這個多維數組轉換成一個對象嗎?這絕對會讓你的生活更輕鬆。這似乎是多維關聯數組濫用的典型例子。 – thatidiotguy

+0

@thatidiotguy你能詳細說一下嗎? – Ash

+0

我在說,它看起來像你正在使用一個多維數組,類似於你將如何使用一個對象。使用對象的優點是更好的代碼可維護性。在功能上,一切工作非常相似。 – thatidiotguy

回答

0

你可以只調用拆分或爆炸的路徑字符串,然後插入單個值到每個維度。這不是無限的,但我假設你對這個深度的這個例子有一個粗略的想法。

function getPathVal($array, $path) { 
    $path_array = explode("/", $path); 
    $cnt = count($path_array); 
    if ($cnt == 3) { 
     return $array[$path_array[0]][$path_array[1]][$path_array[2]]; 
    } else if ($cnt == 2) { 
      return $array[$path_array[0]][$path_array[1]]; 
    } else if ($cnt == 1) { 
      return $array[$path_array[0]]; 
    } else { 
      return ""; 
    } 
} 
+1

沒有它必須動態工作,因此需要一個功能 – Ash

1

試試這個。很基本的,但它可能會爲您提供一個跳下點:

$array['image']['comment'] = 'something'; 
$array['image']['tag'] = 'happy'; 
$array['image']['colors']['blue'] = '12345'; 

function get_array($array, $path) { 
if(strpos('/', $path) > 0) { 
    list($first, $second, $third) = explode('/', $path); 
    return $array[$first][$second][$third]; 
} 
} 

get_array($array, 'image/colours/blue'); 
+0

這實際上需要一些工作,我看到你有單獨的數組。讓我編輯.. – freshnode

+0

是的 - 我想是的,它必須動態工作,但我可以迭代爆炸的結果 – Ash

2

試試這個:

$arr = array('a' => 'A', 'b' => array('c' => 'C', 'd' => array('e'=>'E'))); 

function read_array($array, $path) 
{ 
    if($pos = strpos($path, '/') !== false){ 
    $key = substr($path, 0, $pos); 
    $restOfKey = substr($path, $pos + 1); 
    return read_array($array[$key], $restOfKey); 
    } else { 
    $key = $path; 
    return $array[$key]; 
    } 
} 

echo read_array($arr, 'a');  //A 
echo read_array($arr, 'b/c'); //C 
echo read_array($arr, 'b/d/e'); //E 

你當然應該添加錯誤檢查和所有。