1

我正在编写某种接受关联数组作为参数的函数。

这个数组可以是:

  1. 空的
  2. 只有一个元素。用钥匙pageParam或者wrapperClass键。
  3. 有两个元素。必须用pageParam和键控wrapperClass

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

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

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

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")

最后两个输入让我感到困惑!尽管我的论点是正确的,但为什么会引发异常。

4

3 回答 3

1

问题在于你的使用方式in_array

它永远不会起作用,因为它一直将一个数组array_keys($parameters)与另一个数组中的字符串匹配array('pageParam', 'wrapperClass')

所以,它不断返回false

PHP:in_array

用作array( array('pageParam', 'wrapperClass'), array('pageParam'), array('wrapperClass'), array())第二个参数in_array可能会起作用。

于 2013-10-04T00:59:37.700 回答
1

该文档没有像应有的那样具有描述性,但是将两个数组作为 args 的意图是 needle 是一个数组,而 haystack 是一个可能包含 needle 数组的数组数组(多维)。我要出去了,所以稍后再看,但也许这是一个替代方案:

if(count(array_diff_key(array_keys(array('pageParam', 'wrapperClass')), $parameters)) > 1) {
    //exception
}
于 2013-10-04T01:03:21.323 回答
1

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

您想要的是 的键$parameters等于 的值array('pageParam', 'wrapperClass'),因此:

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

对于数组,如果两个数组具有相同顺序和相同类型的相同键/值对===,则运算符的计算结果为 TRUE 。如果你不关心顺序,你可以使用.==

顺便说一句,这个检查使第一个无用。

于 2013-10-04T01:06:31.713 回答