【问题标题】:Multidimensional associative arrays without knowing the string keys不知道字符串键的多维关联数组
【发布时间】:2018-07-27 17:39:22
【问题描述】:

我需要能够获取一个未知深度的数组,并在不知道它们的值的情况下从特定维度获取键。例如:

$deepArray = array(
    "fooArray1_1" => array(
        "fooArray2_1" => array(
           "fooA" => "3",
           "fooB" => "foo string example 1",
            ),
        "fooArray2_2" => array(
           "fooA" => "foo number 10",
           "fooB" => "foo string example",
            ),
    ),
    "fooArray1_2" => array(
        "fooA" => "foo number 102",
        "fooB" => "foo string example 3",
    ),
);

我希望能够从 $deepArray[0][1] 获取密钥,在这种情况下应该是 fooArray2_2

【问题讨论】:

  • array_keys() 应该有助于您解决这个问题
  • 要遍历未知深度的结构,您应该使用递归函数。
  • 那么只是键 "fooArray2_2" 还是您想要该键下的数据?
  • @AbraCadaver 和 splash58。感谢您的帮助。你解决了我的问题。我试图给你们两个投票,但我没有权限。
  • 如果您想要密钥,请接受@splash58 的回答,如果您想要该密钥下的数据,请接受我的回答。

标签: php arrays multidimensional-array associative-array


【解决方案1】:
function getKey($arr, $path) {
    // save last step
    $s = array_pop($path);
    // go through the array to the desired point 
    foreach($path as $x) {
        $arr = $arr[array_keys($arr)[$x]];
    }
    // get target key  
    return array_keys($arr)[$s]; 
}

echo getKey($deepArray, [0,1]); // fooArray2_2

demo

【讨论】:

    【解决方案2】:

    你说你想要key,但如果你真的想要那个key下的数据;这是我的答案How to write getter/setter to access multi-level array by key names? 中的一个示例,修改为使用array_values 进行数字索引:

    function get_by_offsets($path, $array) {
        $temp = &$array;
    
        foreach($path as $key) {
            $temp = array_values($temp);
            $temp =& $temp[$key];
        }
        return $temp;
    }
    
    $result = get_by_offsets([0, 1], $deepArray); //returns NULL if the path doesn't exist
    

    产生$deepArray['fooArray1_1']['fooArray2_2']下的数据:

    Array
    (
        [fooA] => foo number 10
        [fooB] => foo string example
    )
    

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 2017-12-07
      • 2011-07-28
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多