2013-12-15 33 views
1

有一天我問了一個與此相關的問題,我得到了一個答案,但它沒有做我想要的。下面是遍歷多維關聯數組,檢查按鍵是否是數組中(從回答我剛纔的問題)的方法,我有:查找嵌套關聯數組中的鍵

private function checkKeyIsInArray($dataItemName, $array) 
{ 
    foreach ($array as $key => $value) 
    { 
     // convert $key to string to prevent key type convertion 
     echo '<pre>The key: '.(string) $key.'</pre>'; 

     if ((string)$key == $dataItemName) 
      return true; 

     if (is_array($value)) 
      return $this->checkKeyIsInArray($dataItemName, $value); 

    } 
    return false; 
} 

這裏是我的陣列stucture:

Array (
    [0] => Array ([reset_time] => 2013-12-11 22:24:25) 
    [1] => Array ([email] => [email protected]) 
) 

該方法遍歷第一個數組分支,但不是第二個。有人可以解釋爲什麼這可能是這種情況嗎?看來我失去了一些東西。

+0

你能展示把你的問題的輸出? –

+0

您的多維數組的示例... – Prix

+0

爲什麼不使用內置PHP函數的array_key_exists? – user602525

回答

4

問題是,無論成功還是失敗,您都會返回遞歸調用返回的任何內容。如果在遞歸期間發現密鑰,則只應該返回,否則應該保持循環。

private function checkKeyIsInArray($dataItemName, $array) 
{ 
    foreach ($array as $key => $value) 
     { 
      // convert $key to string to prevent key type convertion 
      echo '<pre>The key: '.(string) $key.'</pre>'; 

      if ((string)$key == $dataItemName) 
       return true; 

      if (is_array($value) && $this->checkKeyIsInArray($dataItemName, $value)) 
       return true; 

     } 
    return false; 
} 

順便說一句,爲什麼這是一個非靜態函數?它似乎不需要任何實例屬性。

+0

謝謝Barmar - 我會在今天下午晚些時候嘗試一下你的建議。關於你對這個方法的查詢是否是靜態的,你是對的 - 它不需要實例屬性。然而,我不確定如何使靜態方法有助於應用程序。該方法存在於我的對象內部,作爲對每個值對象中存在的數據結構進行變異的過程的一部分。在這個階段,我還沒有找到這種方法的另一種用法。如果還有一些其他的必要條件,那麼我當然應該看看它。你能否澄清爲什麼我應該把它變成靜態的? –

+0

這只是一個編碼純度的原因。如果一個方法不依賴於實例,那麼使其變爲靜態就可以清楚地說明這一點。在實現中也可能有一些效率,因爲它只需要傳遞一個參數(非靜態方法接收'$ this'作爲隱式參數),並且方法查找不必掃描虛擬表。 – Barmar

+1

謝謝巴爾瑪。 +1對於靜態方法的頭腦 - 思考的食物。 –