确定数组是否是关联的(哈希)

时间:2011-05-13 19:23:04

标签: php arrays hash

我希望能够将数组传递给函数,并使函数的行为有所不同,具体取决于它是“列表”样式数组还是“散列”样式数组。 E.g:

myfunc(array("One", "Two", "Three")); // works
myfunc(array(1=>"One", 2=>"Two", 3=>"Three")); also works, but understands it's a hash

可能输出如下内容:

One, Two, Three
1=One, 2=Two, 3=Three

ie:当函数“检测到”它被传递的是散列而不是数组时,函数会执行不同的操作。你能说我来自Perl背景,其中%哈希是@arrays的不同引用吗?

我相信我的例子很重要,因为我们不能只测试密钥是否为数字,因为你很可能在哈希中使用数字键。

我特别希望避免使用myfunc(array(array(1=>"One"), array(2=>"Two"), array(3=>"Three")))

的混乱构造

5 个答案:

答案 0 :(得分:38)

拔出kohana框架。

public static function is_assoc(array $array)
{
    // Keys of the array
    $keys = array_keys($array);

    // If the array keys of the keys match the keys, then the array must
    // not be associative (e.g. the keys array looked like {0:0, 1:1...}).
    return array_keys($keys) !== $keys;
}

答案 1 :(得分:14)

This benchmark提供了3种方法。

以下是摘要,从最快到最慢排序。有关更多信息,请阅读完整的benchmark here

<强> 1。使用array_values()

function($array) {
    return (array_values($array) !== $array);
}

<强> 2。使用array_keys()

function($array){
    $array = array_keys($array); return ($array !== array_keys($array));
}

第3。使用array_filter()

function($array){
    return count(array_filter(array_keys($array), 'is_string')) > 0;
}

答案 2 :(得分:7)

从技术上讲,PHP将所有数组视为哈希,因此没有一种确切的方法可以做到这一点。我相信你最好的选择是:

if (array_keys($array) === range(0, count($array) - 1)) {
   //it is a hash
}

答案 3 :(得分:0)

不,PHP不区分键是数字字符串的数组,其中键是整数,如下所示:

$a = array("0"=>'a', "1"=>'b', "2"=>'c');
$b = array(0=>'a', 1=>'b', 2=>'c');

var_dump(array_keys($a), array_keys($b));

输出:

array(3) {
    [0]=> int(0) [1]=> int(1) [2]=> int(2)
}
array(3) {
    [0]=> int(0) [1]=> int(1) [2]=> int(2)
}

(以上格式为可读性)

答案 4 :(得分:0)

我的解决方案是获取如下数组的键,并检查键是否不是整数:

private function is_hash($array) {
    foreach($array as $key => $value) {
        return ! is_int($key);
    }
    return false;
}

获取如下所示的哈希数组的array_keys是错误的:

array_keys(array(
       "abc" => "gfb",
       "bdc" => "dbc"
       )
);

将输出:

array(
       0 => "abc",
       1 => "bdc"
)

因此,将它与最高评级答案中提到的一系列数字进行比较并不是一个好主意。如果您尝试将键与范围进行比较,它总是会说它是一个哈希数组。