PHP-有没有办法快速判断数组是键值对还是数字索引的结构?

服务器管理 服务器管理 主题:1035 回复:2217

PHP-有没有办法快速判断数组是键值对还是数字索引的结构?

归属感 发布于 2017-04-01 字数 147 浏览 1030 回复 5

array('a','b','c') 和 array('a'=>'a1','b'=>'b1') 这两个数组一个是键值对的结果,一个是数字索引,我想知道有没有什么办法快速的区别他们?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(5

归属感 2017-09-26 5 楼

前面的回答忽略了一个情况:

 $array1 = [ '0'=>'是', '1'=>'否' ];
$array2 = [ '是', '否' ];

这种情况下通过比较数组或者 键名数量都无法区分
我的思路比较如下:
向数组前插入一个元素,那么原来的第一个元素现在如果是索引是1, 键名则不变仍为0
比较新数组第二个元素键名即可,再比较末尾元素键名是否等于元素数量可区分是否完全无键名数组

 if ( array_keys( array_merge([],$data))[1] != 0 )

浮生未歇 2017-09-12 4 楼

啥也不说了,上代码:

$arr = array(1,2,3,4,5,6,7,8,9,80);
$keys = array_keys($arr);
echo array_sum($keys) == array_sum(array_keys($keys))? '索引数组' : '关联数组';

清晨说ぺ晚安 2017-08-20 3 楼

$arr = array(1,2,3,4);
//$arr = array('a'=>'a1','b'=>'b1','c'=>'c1');
//$arr = array(1,'a'=>'a1',2,3,'cc'=>'4');

  $c = count($arr);
$in = array_intersect_key($arr,range(0,$c-1));

if(count($in) == $c) {
    //索引数组
}else if(empty($in)) {
    //关联数组
}else{
    //混合数组
}
清晨说ぺ晚安 2017-08-17 2 楼

简单的办法就是用array_keys获取索引数组然后用range函数根据数组长度生成一个相同长度的数组进行对比,如果内容都是0-数组长度-1那么就能确定它是一个纯数字索引的数组。

<?php
function is_assoc_array($array)
{
return array_keys($array) !== range(0, count($array) - 1);
}

归属感 2017-06-29 1 楼

var_dump(array_values($arr) === $arr);
//true 数字索引; 反之