2010-03-24 6 views
5

Я пытаюсь найти способ вернуть значение родительского ключа массива.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 
             ) 
           ) 
         ) 
       ) 
     ) 

ответ

1

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

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'); 
+0

Я не слишком хорошо знаком с рекурсией, но я закодирован до такого же ответа на этот вопрос, только я использовал «статические» переменный для замены аргумента '$ parent', который вы используете. Или лучше? – alex

+0

@alex 'static', вероятно, будет работать отлично. Я должен признать, что я не очень «статичный» пользователь. :) Это избавит вас от необходимости передавать дополнительную переменную. OTOH, в приведенной выше функции вы можете указать родителя по умолчанию ... Либо все нормально, я думаю. :) – deceze

+0

Спасибо, я понимаю преимущества вашего метода. +1 – alex

2

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

-2
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(); 

} 
Смежные вопросы