9

I'm trying to find a way to return the value of an array's parent key.

For example, from the array below I'd like to find out the parent's key where $array['id'] == "0002". The parent key is obvious because it's defined here (it would be 'products'), but normally it'd be dynamic, hence the problem. The 'id' and value of 'id' is known though.

    [0] => Array
        (
            [data] => 
            [id] => 0000
            [name] => Swirl
            [categories] => Array
                (
                    [0] => Array
                        (
                            [id] => 0001
                            [name] => Whirl
                            [products] => Array 
                               (
                                    [0] => Array
                                        (
                                            [id] => 0002
                                            [filename] => 1.jpg
                                         )
                                    [1] => Array
                                        (
                                            [id] => 0003
                                            [filename] => 2.jpg
                                         )
                                )
                         )
                 )
          )

3 Answers 3

3

A little crude recursion, but it should work:

function find_parent($array, $needle, $parent = null) {
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $pass = $parent;
            if (is_string($key)) {
                $pass = $key;
            }
            $found = find_parent($value, $needle, $pass);
            if ($found !== false) {
                return $found;
            }
        } else if ($key === 'id' && $value === $needle) {
            return $parent;
        }
    }

    return false;
}

$parentkey = find_parent($array, '0002');
Sign up to request clarification or add additional context in comments.

4 Comments

I'm not too familiar with recursion, but I coded up a similar answer to this, only I used a 'static' variable to replace the $parent argument you use. Is either way better?
@alex static would probably work fine as well. I have to admit I'm not much of a static user. :) It'd eliminate the need to pass along the extra variable. OTOH, in the above function you can specify a "default" parent... Either one's okay I guess. :)
Thanks, I understand the benefits of your method. +1
I'm curious, is there a better data structure to use instead of an array if one has this need? It's been a long time since I had some good programming training but would a Linked List work better? That way you don't have to search through an array every time you want a given parent (think of returning every parent of a child until the root). Though, I've yet to really use linked lists in PHP. Perhaps they're not that easy to do?
2

Since you have a tree structure either of a BFS or DFS can do it. Since the structure is variable a recursive solution would work well. Simply return a sentinel when you find the value, then return the key in the caller.

Comments

-3
function array_to_xml($array, $rootElement = null, $xml = null) {

    $_xml = $xml;

    if ($_xml === null) {
        $_xml = new SimpleXMLElement($rootElement !== null ? $rootElement : '<root/>');
    }

    $has_int_key = 0;

    foreach ($array as $k => $v) {
        if (is_array($v)) {
            if(is_int($k)){
                $this->array_to_xml($v, $k, $_xml->addChild($rootElement));
            } 
            else {
                foreach($v as $key=>$value) {
                    if(is_int($key)) $has_int_key = 1;
                }

              if ($has_int_key) {
                  $this->array_to_xml($v, $k, $_xml);
              } else {
                  $this->array_to_xml($v, $k, $_xml->addChild($k));
              }
            }
        } 
        else {
            $_xml->addChild($k, $v);
        }
    }

    return $_xml->asXML();

}

1 Comment

you have posted a code snipped without any description or comment. also as your code shows it works with xml data. its not related with the question!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.