【问题标题】:How can I access a multidimensional array element by path? [duplicate]如何通过路径访问多维数组元素? [复制]
【发布时间】:2023-03-29 13:40:01
【问题描述】:

可能重复:
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';

如果我有字符串中每个元素的路径,如何设置或获取数组值?

例如 $path = 'image/colors/blue'; 下面的函数应该返回 12345

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

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

【问题讨论】:

  • 有什么办法可以把这个多维数组变成一个对象吗?那肯定会让你的生活更轻松。这似乎是多维关联数组滥用的典型示例。
  • @thatidiotguy 你能详细说明一下吗?
  • 我是说您使用多维数组的方式类似于使用对象的方式。使用对象的优点是更好的代码可维护性。在功能上,一切都非常相似。

标签: php arrays multidimensional-array


【解决方案1】:

试试这个:

$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

你当然应该添加错误检查等等。

【讨论】:

    【解决方案2】:

    试试这个。非常基本,但它可能会为您提供一个起点:

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

    【讨论】:

    • 这实际上需要一些工作,我已经看到你有单独的数组。让我编辑..
    • 是的 - 我想是的,它必须动态工作,但我可以迭代爆炸的结果
    【解决方案3】:

    您可以在路径字符串上调用 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 "";
        }
    }
    

    【讨论】:

    • 不,它必须动态工作,因此需要一个函数
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多