代码之家  ›  专栏  ›  技术社区  ›  maček

区分关联数组和常规数组

  •  3
  • maček  · 技术社区  · 15 年前

    注: 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 回复  |  直到 15 年前
        1
  •  6
  •   Artefacto    15 年前

    只需检查任何键的类型:

    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
    
        2
  •  2
  •   ircmaxell    15 年前

    你可以用支票 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
    }
    

    但请注意,数字是关联数组的有效键。我假设你说的是一个带有字符串键的关联数组(上面的if将处理这个数组)。。。

        3
  •  2
  •   BoltClock    15 年前

    假设 $foo 是同质的,只要检查一下 钥匙就这样。

    <?php
    
    function my_func(array $foo) {
        if (!is_int(key($foo))) {
            echo 'Found associative array';
        } else {
            echo 'Found indexed array';
        }
    }
    
    ?>
    
        4
  •  0
  •   Mchl    15 年前

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

        5
  •  0
  •   Marc B    15 年前

    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
       }
    }
    
        6
  •  0
  •   tamasd    15 年前
    function is_associative($array) {
      return count(array_keys($array)) != array_filter(array_keys($array), 'is_numeric');
    }