【发布时间】:2011-02-07 04:43:15
【问题描述】:
如何确定 PHP 数组是否是这样构建的:
array('First', 'Second', 'Third');
或者像这样:
array('first' => 'First', 'second' => 'Second', 'third' => 'Third');
???
【问题讨论】:
如何确定 PHP 数组是否是这样构建的:
array('First', 'Second', 'Third');
或者像这样:
array('first' => 'First', 'second' => 'Second', 'third' => 'Third');
???
【问题讨论】:
我的 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) 进行比较具有更好的性能。
【讨论】:
print_r($array);
【讨论】:
没有区别
array('First', 'Second', 'Third');
和
array(0 => 'First', 1 => 'Second', 2 => 'Third');
前者只有隐含的键,而不是你指定它们
【讨论】:
以编程方式,您不能。我想检查像您这样的情况的唯一方法是执行以下操作: foreach ($myarray as $key => $value) { if ( is_numeric($key) ) { echo "数组似乎使用数字(可能是第一个的情况)"; } }
但这不会检测到数组构建为 $array = array(0 => "first", 1 => "second", etc);
【讨论】:
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 愉快地刷卡。
【讨论】:
这有点棘手,尤其是 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 创建了整个数组的副本。不好,尤其是当您只对数组的键感兴趣时。
array_keys 中创建了多个副本。因此,我不会轻易爆破foreach 解决方案......
array_keys 可能会使用数组指针或类似的东西来遍历数组。还是我错了?
foreach 所需的副本。
如果你有 php > 5.1 并且只寻找从 0 开始的数组,你可以将代码压缩到
$stringKeys = array_diff_key($a, array_values($a));
$isZeroBased = empty($stringKeys);
希望对你有帮助 杰罗姆·瓦格纳
【讨论】:
function isAssoc($arr)
{
return $arr !== array_values($arr);
}
【讨论】: