访问不知道父元素的多维数组元素


Access Multidimensional Array element with out knowing parent elements

我有一个函数,它返回以下多维数组。我无法控制数组的形成。我试图访问"结果"元素。这个问题是,父元素的名称不断变化。'Result'元素的位置总是相同的(因为名称是"Result")。是否有可能在不知道父元素名称的情况下访问该元素?

    Array
(
    [sHeader] => Array
        (
            [aAction] => ActionHere
        )
[sBody] => Array
    (
        [CreatePropertyResponse] => Array
            (
                [CreatePropertyResult] => Array
                    (
                        [Message] => Successfully completed the operation
                        [Result] => 0
                        [TransactionDate] => 2013-05-19T21:54:35.765625Z
                        [bPropertyId] => 103
                    )
            )
    )

)

递归搜索数组键/值的一个简单方法是使用递归迭代器;这些都是内置类,是标准PHP库的一部分。

$result   = false;
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach ($iterator as $key => $value) {
    if ($key === 'Result') {
        $result = $value;
        break;
    }
}
var_dump($result);
这里的好处是,如果您愿意,您可以检查数组结构中Result项($iterator->getDepth())的深度和/或检查一个或多个祖先键($iterator->getSubIterator(…)->key())。

如果父元素只有一个子元素,则可以通过获取array_keys()返回的唯一元素并深入两层来解决。

无论如何,如果你的数组改变了很多,并且你必须系统地访问一个嵌套的属性,你肯定有一个设计问题

Edit: array_column在这种情况下实际上不起作用。你可以递归地搜索每一层,直到找到给定的键。比如:

function find_key_value($array, $search_key) {
    if (isset($array[$search_key])) return $array[$search_key];
    $found = false;
    foreach ($array as $key=>$value) {
         if (is_array($value)) $found = find_key_value($value, $search_key);
         if ($found) return $found; 
    }
    return false;
}
function findkeyval($arr,$key) {
    if(isset($arr[$key])) {
        return $arr[$key];
    }else {
        foreach($arr as $a) {
            if(is_array($a)) {
                $val=findkeyval($a,$key);
                if($val) {
                   return $val;
                }
            }
        }
    }
}