检查是否给出了某些数组键

时间:2013-10-04 00:38:02

标签: php arrays function arguments associative-array

我正在编写某种函数,它接受一个关联数组作为参数。

这个数组可以是:

  1. 只有一个元素。使用密钥pageParamwrapperClass
  2. 有两个要素。必须使用pageParamwrapperClass
  3. 键入

    现在我写了这些检查以确保:

    1. 数组不超过2个元素。
    2. 该数组没有pageParamwrapperClass
    3. 以外的任何元素

      问题是,我的第二次检查无法正常工作。这是我的代码:

      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("dummyKey"=>"dummyValue")
      2. array("dummyKey1"=>"dummyValue1", "dummyKey2"=>"dummyValue2")
      3. array("pageParam"=>"test")array("wrapperClass"=>"wrapper_class")
      4. array("pageParam"=>"test", "wrapperClass"=>"wrapper_class")
      5. 最后两个输入让我感到困惑!尽管我的论点是正确的,为什么抛出异常。

3 个答案:

答案 0 :(得分: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 :(得分:1)

doc不像它们应该那样具有描述性,但是两个数组作为args的意图是针是一个数组而haystack是一个可能包含针数组的数组(多维)数组。我要出去了,以后再看一遍,但也许这是另一种选择:

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

答案 2 :(得分:1)

您的第二张检查会在array_keys($parameters)内查找值array('pageParam', 'wrapperClass')。它将一个字符串数组与两个字符串值进行比较。

你想要的是$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。如果您不关心订单,可以使用==

顺便说一下,这个检查会使第一个无效。