【问题标题】:Determine if a PHP array uses keys or indices [duplicate]确定 PHP 数组是否使用键或索引 [重复]
【发布时间】:2011-02-07 04:43:15
【问题描述】:

如何确定 PHP 数组是否是这样构建的:

array('First', 'Second', 'Third');

或者像这样:

array('first' => 'First', 'second' => 'Second', 'third' => 'Third');

???

【问题讨论】:

    标签: php arrays indexing key


    【解决方案1】:

    我的 PHP 工具包里有这些简单的功能:

    function is_flat_array($ar) {
        if (!is_array($ar))
            return false;
    
        $keys = array_keys($ar);
        return array_keys($keys) === $keys;
    }
    
    function is_hash($ar) { 
       if (!is_array($ar))
           return false;
    
       $keys = array_keys($ar);
       return array_keys($keys) !== $keys;
    }
    

    我从未在大型阵列上测试过它的性能。我主要在具有 10 个或更少键的数组上使用它,所以这通常不是问题。我怀疑它会比将 $keys 与生成的范围 0..count($array) 进行比较具有更好的性能。

    【讨论】:

      【解决方案2】:
      print_r($array);
      

      【讨论】:

      • 我相信“没有目视检查阵列”或多或少暗示...
      【解决方案3】:

      没有区别

      array('First', 'Second', 'Third');
      

      array(0 => 'First', 1 => 'Second', 2 => 'Third');
      

      前者只有隐含的键,而不是你指定它们

      【讨论】:

      • 这不是问题使用的代码,其中数组确实不同。
      【解决方案4】:

      以编程方式,您不能。我想检查像您这样的情况的唯一方法是执行以下操作: foreach ($myarray as $key => $value) { if ( is_numeric($key) ) { echo "数组似乎使用数字(可能是第一个的情况)"; } }

      但这不会检测到数组构建为 $array = array(0 => "first", 1 => "second", etc);

      【讨论】:

        【解决方案5】:
        function is_assoc($array) {
            return (is_array($array) 
               && (0 !== count(array_diff_key($array, array_keys(array_keys($array)))) 
               || count($array)==0)); // empty array is also associative
        }
        

        还有一个

        function is_assoc($array) {
            if ( is_array($array) && ! empty($array) ) {
                for ( $i = count($array) - 1; $i; $i-- ) {
                    if ( ! array_key_exists($i, $array) ) { return true; }
                }
                return ! array_key_exists(0, $array);
            }
            return false;
        }
        

        从 PHP 文档网站上的 the is_array comments 愉快地刷卡。

        【讨论】:

          【解决方案6】:

          这有点棘手,尤其是 array('First', 'Second', 'Third'); 这个表单隐式地让 PHP 生成键值。

          我想一个有效的解决方法是这样的:

          function array_indexed( $array )
          {
              $last_k = -1;
          
              foreach( $array as $k => $v )
              {
                  if( $k != $last_k + 1 )
                  {
                      return false;
                  }
                  $last_k++;
              }
          
              return true;
          }
          

          【讨论】:

          • 这将导致数组的内存使用率极低,因为foreach 创建了整个数组的副本。不好,尤其是当您只对数组的键感兴趣时。
          • @meagar:您的解决方案在array_keys 中创建了多个副本。因此,我不会轻易爆破foreach 解决方案......
          • @meager:我没有意识到这一点。谢谢(你的)信息。 @Billy:我在想,但后来意识到array_keys 可能会使用数组指针或类似的东西来遍历数组。还是我错了?
          • @billy array_keys 只复制数组的键,它们(希望)是整数或短字符串;通常,数组的值是大块数据所在的位置
          • @meagar:这高度依赖数据。我相信您可以通过使用引用参数来省略foreach 所需的副本。
          【解决方案7】:

          如果你有 php > 5.1 并且只寻找从 0 开始的数组,你可以将代码压缩到

          $stringKeys = array_diff_key($a, array_values($a));
          $isZeroBased = empty($stringKeys);
          

          希望对你有帮助 杰罗姆·瓦格纳

          【讨论】:

            【解决方案8】:
            function isAssoc($arr)
            {
                return $arr !== array_values($arr);
            }
            

            【讨论】:

              猜你喜欢
              • 2017-04-13
              • 2023-04-02
              • 2020-02-01
              • 2014-10-25
              • 2021-12-26
              • 2013-11-11
              • 1970-01-01
              • 2012-05-18
              • 1970-01-01
              相关资源
              最近更新 更多