2013-10-04 73 views
1

我在寫一些接受關聯數組作爲參數的函數。檢查某些數組鍵是否被賦值

此陣列可以是:

  1. 僅具有一個元素。使用密鑰pageParamwrapperClass
  2. 有兩個元素。必須鍵入pageParamwrapperClass

現在我已經寫這些檢查,以確保:

  1. 陣列是不大於2個元素。
  2. 數組沒有其他任何元素比pageParamwrapperClass

的問題是,我的第二次檢查工作不正常。這裏是我的代碼:

  1. array("dummyKey"=>"dummyValue")
  2. array("dummyKey1"=>"dummyValue1", "dummyKey2"=>"dummyValue2")
  3. array("pageParam"=>"test")或者array("wrapperClass"=>"wrapper_class")
  4. array("pageParam"=>"test", "wrapperClass"=>"wrapper_class")
  5. public function init_paginator(array $parameters = array()) 
    { 
        if(!empty($parameters)) 
        { 
          // This check works 
         if(count($parameters) > 2) 
         { 
          throw new \Exception("Paginator only accepts 2 elements in array: pageParam and wrapperClass."); 
         } 
    
          // This check does not work, even if its condition is satisfied 
         if(!in_array(array_keys($parameters), array('pageParam', 'wrapperClass'))) 
         { 
          throw new \Exception("Paginator only accepts 2 elements in array: pageParam and wrapperClass.");  
         } 
    
         // Code.. 
        } 
    
    } 
    

    ,如果我進入了數組參數就像在第二次檢查的異常始終拋出

最後兩個輸入是什麼使我困惑!儘管我的觀點是正確的,但爲什麼會拋出異常。

回答

1

你的第二個檢查查找內部array('pageParam', 'wrapperClass')價值array_keys($parameters)。它將字符串數組與兩個字符串值進行比較。

你想要的是一個$parameters的關鍵是等於array('pageParam', 'wrapperClass')的價值觀,即:

array_keys($parameters) === array('pageParam', 'wrapperClass'); 

對於數組,該===運營商如果both arrays have the same key/value pairs in the same order and of the same types值爲TRUE。如果您不關心訂單,則可以使用==

順便說一下,此檢查呈現第一個無用。

1

的問題是在你使用in_array

它永遠也不會工作,因爲它使另一個數組中的匹配數組array_keys($parameters)爲字符串array('pageParam', 'wrapperClass')

所以,它一直返回false

看到的樣子PHP: in_array

使用array(array('pageParam', 'wrapperClass'), array('pageParam'), array('wrapperClass'), array())作爲in_array的第二個參數可能有效。

1

文檔不像它們應該描述的那樣,但是將兩個數組作爲參數的意圖是針是一個數組,乾草堆是可能包含針的陣列(多維)陣列陣列。我前往了所以會稍後再看看,但也許這是一種替代方案:

if(count(array_diff_key(array_keys(array('pageParam', 'wrapperClass')), $parameters)) > 1) { 
    //exception 
}