如何通过路径访问多维数组元素?

3
可能重复:
PHP:如何使用字符串作为数组索引路径来检索值

我有一个数组,如下所示:

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

如果我有每个元素的路径字符串,如何设置或获取数组的值?
例如,当 $path = 'image/colors/blue'; 时,下面的函数应该返回 12345
function get_array($array, $path)
{
//what goes here?
}

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

有没有办法将这个多维数组转换为一个对象?这肯定会让你的生活更轻松。这似乎是多维关联数组滥用的典型例子。 - thatidiotguy
@thatidiotguy 你能详细说明一下吗? - Mazatec
我想说的是,你似乎正在以类似于使用对象的方式使用多维数组。使用对象的优点是更好的代码可维护性。从功能上讲,一切都运作得非常相似。 - thatidiotguy
3个回答

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

当然,您需要添加错误检查等功能。


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');

这需要进行一些处理,我看到你有各自的数组。让我来编辑一下... - Tom Hallam
是的,我想是这样的,它必须能够动态地工作,但我可以迭代爆炸结果。 - Mazatec

0
你可以在路径字符串上调用split或explode函数,并将每个值插入到每个维度中。这不是无限的,但我假设你对这个例子的深度有一个大致的想法。
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
不,它必须具有动态性,因此需要一个函数。 - Mazatec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接