PHP - найти родительский ключ массива

Я пытаюсь найти способ вернуть значение родительского ключа массива.

Например, из приведенного ниже массива я хотел бы узнать родительский ключ, где $array['id'] == "0002". Родительский ключ очевиден, потому что он определен здесь (это будут «продукты»), но обычно он будет динамическим, отсюда и проблема. Однако «id» и значение «id» известны.

    [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
                                         )
                                )
                         )
                 )
          )

person Jay Are    schedule 24.03.2010    source источник


Ответы (2)


Немного грубая рекурсия, но она должна работать:

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');
person deceze♦    schedule 24.03.2010
comment
Я не слишком хорошо знаком с рекурсией, но я написал аналогичный ответ на этот вопрос, только я использовал «статическую» переменную для замены используемого вами аргумента $parent. В любом случае лучше? - person alex; 24.03.2010
comment
@alex static, вероятно, тоже подойдет. Должен признаться, я не особо люблю static. :) Это устранило бы необходимость передавать дополнительную переменную. OTOH, в приведенной выше функции вы можете указать родителя по умолчанию ... Думаю, любой из них в порядке. :) - person deceze♦; 24.03.2010
comment
Спасибо, я понимаю преимущества вашего метода. +1 - person alex; 25.03.2010
comment
Мне любопытно, есть ли лучшая структура данных для использования вместо массива, если у кого-то есть такая необходимость? Прошло много времени с тех пор, как я хорошо обучался программированию, но будет ли связный список работать лучше? Таким образом, вам не нужно искать в массиве каждый раз, когда вам нужен данный родитель (подумайте о возврате каждого родителя дочернего элемента до корня). Хотя я еще не использовал связанные списки в PHP. Может быть, их не так просто сделать? - person jmbertucci; 27.07.2011

Поскольку у вас есть древовидная структура либо BFS, либо DFS может это сделать. Поскольку структура является переменной, рекурсивное решение будет работать хорошо. Просто верните дозорный, когда найдете значение, а затем верните ключ в вызывающем объекте.

person Ignacio Vazquez-Abrams    schedule 24.03.2010