区分关联数组与常规数组

时间:2010-08-12 19:46:29

标签: php arrays associative-array

无需更改函数签名,我希望PHP函数在给定关联数组而不是常规数组时表现不同。

注意:您可以假设数组是同质的。例如,array(1,2,"foo" => "bar")不被接受,可以忽略。

function my_func(Array $foo){
  if (…) {
    echo "Found associated array";
  }
  else {
    echo "Found regular array";
  }
}


my_func(array("foo" => "bar", "hello" => "world"));
# => "Found associated array"

my_func(array(1,2,3,4));
# => "Found regular array"

这可以用PHP吗?

6 个答案:

答案 0 :(得分:6)

只需检查任何键的类型:

function is_associative(array $a) {
    return is_string(key($a));
}

$a = array(1 => 0);
$a2 = array("a" => 0);

var_dump(is_associative($a)); //false
var_dump(is_associative($a2)); //true

答案 1 :(得分:2)

你可以使用array_values检查,如果你的阵列很小并且你不关心开销(如果它们很大,这将是非常昂贵的,因为它需要复制整个阵列只是为了检查,然后处置它):

if ($array === array_values($array)) {}

如果你关心记忆,你可以这样做:

function isAssociative(array $array) {
    $c = count($array);
    for ($i = 0; $i < $c; $i++) {
        if (!isset($array[$i])) {
            return true;
        }
    }
    return false;
}

请注意,这会相当慢,因为它涉及迭代,但它应该更高效,因为它不需要复制数组。

编辑:考虑到您的同质性要求,您可以这样做:

if (isset($array[0])) {
    // Non-Associative
} else {
    // Associative
}

但请注意,数字是关联数组的有效键。我假设你在谈论一个带有字符串键的关联数组(这就是上面将要处理的内容)......

答案 2 :(得分:2)

假设$foo是同质的,只需检查一个键的类型即可。

<?php

function my_func(array $foo) {
    if (!is_int(key($foo))) {
        echo 'Found associative array';
    } else {
        echo 'Found indexed array';
    }
}

?>

答案 3 :(得分:0)

根据您的评论Assume arrays are homogenous; no mixtures.: 只需检查第一个(或最后一个或随机)键是整数还是字符串。

答案 4 :(得分:0)

这是一种方法,通过检查是否有任何由非数字值组成的键:

function my_func($arr) {
   $keys = array_keys($arr); // pull out all the keys into a new array
   $non_numeric = preg_grep('/\D/', $keys); // find any keys containing non-digits
   if (count($non_numeric) > 0) {
       return TRUE; // at least one non-numeric key, so it's not a "straight" array
   } else {
       return FALSE: // all keys are numeric, so most likely a straight array
   }
}

答案 5 :(得分:0)

function is_associative($array) {
  return count(array_keys($array)) != array_filter(array_keys($array), 'is_numeric');
}