无需更改函数签名,我希望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吗?
答案 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');
}