php - 如何检查PHP数组是关联或者顺序 ?

  显示原文与译文双语对照的内容

PHP将所有数组视为关联,因此没有任何内置函数。 任何人都能推荐一种有效的方法来检查数组是否只包含数字键?

基本上,我希望能够区分这一点:


$sequentialArray = array('apple', 'orange', 'tomato', 'carrot');

还有这个:


$assocArray = array('fruit1' => 'apple', 
 'fruit2' => 'orange', 
 'veg1' => 'tomato', 
 'veg2' => 'carrot');

时间:

你已经问了两个不完全等价的问题:

  • 首先,如何确定数组是否只有数字键
  • 其次,如何确定数组是否具有顺序数字键,从 0开始

请考虑你实际需要哪些行为。 ( 可能是为了你的目的。)

第一个问题( 检查所有键是否为数字) 是由船长黑仔 回答很好。

对于第二个问题( 检查数组是否为zero-indexed和顺序),你可以使用以下函数:


<?php

function isAssoc($arr)
{
 return array_keys($arr)!== range(0, count($arr) - 1);
}

var_dump(isAssoc(array('a', 'b', 'c')));//false
var_dump(isAssoc(array("0" => 'a',"1" => 'b',"2" => 'c')));//false
var_dump(isAssoc(array("1" => 'a',"0" => 'b',"2" => 'c')));//true
var_dump(isAssoc(array("a" => 'a',"b" => 'b',"c" => 'c')));//true

?>

最近我偶然发现了这个问题,这是怎么我检查一个数组是否关联与否:


function is_assoc($array) {
 return (bool)count(array_filter(array_keys($array), 'is_string'));
}

函数假定:

  1. is_array($array) == true
  2. 如果至少有一个字符串键,$array 将被视为关联数组

希望有帮助

Speed-wise:


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

Memory-wise:


function isAssoc($array)
{
 $array = array_keys($array); return ($array!== array_keys($array));
}

实际上最有效的方法是:


function is_assoc($a){
 $a = array_keys($a);
 return ($a!= array_keys($a));
}

这是因为它比较键( 对于顺序数组,总是 0,1,2 等) 和键( 这将始终 被 0,1,2 等等)的键。

...