2012-10-26 80 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 

你当然应该添加错误检查和所有。