Jason Small
Jason Small

Reputation: 1054

Access Multidimensional Array element with out knowing parent elements

I have function that returns the following multidimensional array. I don't have control of how the array is formed. Im trying to access the 'Result' elements. This issue is, the name of the parent elements constantly changing. The location of the 'Result' element is always the same (as the is the name "Result"). Is it possible to access that element without know the name of the parent elements?

    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
                    )

            )

    )

)

Upvotes: 0

Views: 187

Answers (4)

anomaaly
anomaaly

Reputation: 841

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;
                }
            }
        }
    }
}

Upvotes: 0

salathe
salathe

Reputation: 51950

An easy option to search the array keys/values recursively is to use a recursive iterator; these are built-in classes, part of the Standard PHP Library.

$result   = false;
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach ($iterator as $key => $value) {
    if ($key === 'Result') {
        $result = $value;
        break;
    }
}

var_dump($result);

The bonus here is that you could, if you wanted to, check the depth of the Result item ($iterator->getDepth()) in the array structure and/or check one or more ancestor keys ($iterator->getSubIterator(…)->key()).

Upvotes: 1

dave
dave

Reputation: 64657

Edit: array_column won't actually work in this case. You could search through each level, recursively, until you find the given key. Something like:

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;
}

Upvotes: 0

moonwave99
moonwave99

Reputation: 22817

If the parent elements have only one child, you can solve it by getting the only element given back by array_keys(), and going two levels deep.

Anyway, if your array changes that much, and you systematically have to access a nested property, you have a design issue for sure.

Upvotes: 0

Related Questions