2010-03-24 54 views
5

我想找到一種方法來返回數組的父鍵的值。PHP - 找到數組的父鍵

例如,從陣列下面我想找出母公司的關鍵,其中$陣列[「身份證」] ==「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 2010-03-24 01:32:03

+0

@alex'static'可能工作得很好。我不得不承認我不是一個「靜態」用戶。 :)它消除了傳遞額外變量的需要。 OTOH,在上面的函數中,你可以指定一個「默認」父對象......我猜沒關係。 :) – deceze 2010-03-24 02:08:43

+0

謝謝,我明白你的方法的好處。 +1 – alex 2010-03-25 01:48:28

2

既然你有一個樹形結構無論是BFSDFS的可以做到這一點。由於結構是可變的,遞歸解決方案可以很好地工作。當您找到該值時,只需返回一個標記,然後將該鍵返回給調用者。

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

}