php判断关联数组和索引数组,PHP判断是否为索引数组、连续索引数组、关联数组、混合数组...

## 名称定义

- 索引数组:所有键名都为数值型,注意字符串类型的数字键名会被转换为数值型。

- 连续索引数组:键名是连续性的数字。

- 关联数组:所有键名都为字符串型,注意字符串类型的数字键名会被转换为数值型。

- 混合数组:键名既有数值型也有字符串型。

## 代码

```php

/**

* 判断数组是否为索引数组

*/

function is_indexed_array($arr)

{

if (is_array($arr)) {

return count(array_filter(array_keys($arr), 'is_string')) === 0;

}

return false;

}

/**

* 判断数组是否为连续的索引数组

* 以下这种索引数组为非连续索引数组

* [

* 0 => 'a',

* 2 => 'b',

* 3 => 'c',

* 5 => 'd',

* ]

*/

function is_continuous_indexed_array($arr)

{

if (is_array($arr)) {

$keys = array_keys($arr);

return $keys == array_keys($keys);

}

return false;

}

/**

* 判断数组是否为关联数组

*/

function is_assoc_array($arr)

{

if (is_array($arr)) {

// return !is_indexed_array($arr);

return count(array_filter(array_keys($arr), 'is_string')) === count($arr);

}

return false;

}

/**

* 判断数组是否为混合数组

*/

function is_mixed_array($arr)

{

if (is_array($arr)) {

$count = count(array_filter(array_keys($arr), 'is_string'));

return $count !== 0 && $count !== count($arr);

}

return false;

}

```

## 耗时测试

```php

// 对百万数组进行千次的循环判断

$arr = [];

for ($i = 0; $i < 1000000; $i++) {

$j = 0;

$key = mt_rand(1, 100) >= 50 ? $j++ : md5(time(true));

$arr[$key] = md5(time(true) . time(true));

}

$t = microtime(true);

for ($i = 0; $i < 1000; $i++) {

is_indexed_array($t);

}

echo microtime(true) - $t, "s\n";

$t = microtime(true);

for ($i = 0; $i < 1000; $i++) {

is_assoc_array($t);

}

echo microtime(true) - $t, "s\n";

$t = microtime(true);

for ($i = 0; $i < 1000; $i++) {

is_continuous_indexed_array($t);

}

echo microtime(true) - $t, "s\n";

$t = microtime(true);

for ($i = 0; $i < 1000; $i++) {

is_mixed_array($t);

}

echo microtime(true) - $t, "s\n";

// 输出

// 0.0019919872283936s

// 0.0020020008087158s

// 0.0021991729736328s

// 0.0019669532775879s

```

## 测试结果

对百万数组进行千次的循环判断均为毫秒级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值