2013-10-04 38 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 
}