确定 PHP 数组是使用键还是索引。

3

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

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

或者像这样:
array('first' => 'First', 'second' => 'Second', 'third' => 'Third');

???

8个回答

3

我有一些简单的函数在我的 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)进行比较要好。


0
print_r($array);

4
我认为“没有视觉检查阵列”的意思已经更或多少地被暗示了…… - user229044

0

这两者之间没有任何区别

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

并且

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

前者只有隐式键,而不是您指定它们


1
这不是问题使用的代码,那里的数组确实是不同的。 - user229044

0
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 文档站点的 is_array 评论 中欣然借鉴。


0

这有点棘手,特别是这个表格 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会创建整个数组的副本。这不好,特别是当你只关心数组的键时。 - user229044
@meagar:你的解决方案在array_keys内部创建了多个副本。因此,我不会轻易地使用foreach解决方案... - Billy ONeal
@meager:我之前不知道这个。谢谢你提供的信息。@Billy:我也是这么想的,但后来意识到 array_keys 很可能会使用数组指针或其他方式来遍历数组。或者我错了吗? - kamasheto
@billy,array_keys 只复制数组的键,这些键(希望)是整数或短字符串;通常,数组的值才是大块数据所在的地方。 - user229044
@meagar:这高度依赖于数据。我相信你可以通过使用引用参数来省略foreach所需的复制。 - Billy ONeal

0
如果您的 PHP 版本大于 5.1,且只需要 0 基数组,您可以将代码缩小为:
$stringKeys = array_diff_key($a, array_values($a));
$isZeroBased = empty($stringKeys);

希望这能对你有所帮助 Jerome WAGNER


0
function isAssoc($arr)
{
    return $arr !== array_values($arr);
}

0

以编程方式,您无法这样做。我想在您这种情况下检查的唯一方法是执行以下操作:

foreach ($myarray as $key => $value) {
    if ( is_numeric($key) ) {
        echo "该数组似乎使用数字(可能是第一种情况)";
    }
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接