![]() |
1
553
您提出了两个不完全相同的问题:
考虑一下你真正需要哪些行为。(可能两者都是为了你的目的。) 第一个问题(只是检查所有键是否都是数字)是 answered well by Captain kurO . 对于第二个问题(检查数组是否为零索引和顺序),可以使用以下函数:
|
![]() |
2
415
要仅检查数组是否具有非整数键(而不是数组是否按顺序索引或零索引):
如果至少有一个字符串键,
|
![]() |
3
127
当然,这是一个更好的选择。
|
![]() |
4
73
这个问题中的许多注释者不理解数组如何在PHP中工作。来自 array documentation :
换句话说,没有数组键“8”这样的东西,因为它总是(无声地)转换为整数8。因此,尝试区分整数和数字字符串是不必要的。 如果希望使用最有效的方法检查数组中的非整数键,而不复制数组的一部分(如array_keys()所做的)或全部(如foreach所做的):
这是因为键()在当前数组位置无效时返回空值,并且空值永远不能是有效的键(如果尝试将空值用作数组键,则会自动转换为“”)。 |
![]() |
5
38
AS stated by the OP :
编写一个函数来检查数组是否 结合的 。所以第一件事是: what is a key in a PHP array ?:
这意味着有3种可能的情况:
我们可以使用以下功能检查每个案例。 案例1:所有钥匙 数字 / 整数 .注释 : 此函数返回 真 也适用于空数组。
案例2:所有钥匙 串 .注释 : 此函数返回 真的 也适用于空数组。
案例3。一些钥匙是 串 ,有些钥匙是 数字 / 整数 .注释 : 此函数返回 真的 也适用于空数组。
如下:
现在,对于一个数组 “正品”阵列 我们都习惯了,意思是:
我们可以检查以下功能。 案例3a.钥匙 数字 / 整数 , 相继的 和 零基 .注释 : 此函数返回 真 也适用于空数组。
警告/陷阱(或者,关于PHP中数组键的更为特殊的事实)整数键这些数组的键是 integers :
字符串键这些数组的键是 strings :
看起来像字符串的整数键
如果你认为钥匙在
例如,这些数组的键是 整数 :
但这些数组的关键是 串 :
更重要的是,根据 doc ,
所以这个数组的键 可以也可以不可以 是一个 整数 -这取决于你的平台。
更糟糕的是,PHP往往
婴儿车
如果整数接近2
三十一
=2147483648边界(见
bug 51430
,
bug 52899
)例如,在我的本地环境(Windows7上的xampp 1.7.7上的php 5.3.8)中,
但关于 this live demo on codepad (php 5.2.5),相同的表达式给出
所以关键是
整数
在一个环境中
一串
在另一个,即使
|
![]() |
6
34
速度方面:
记忆方面:
|
![]() |
7
19
实际上,最有效的方法是:
这是因为它将键(对于顺序数组,该键始终为0、1、2等)与键(该键将 总是 为0、1、2等)。 |
![]() |
8
18
|
![]() |
9
17
我都用过了
这是因为
以下函数比上面提供的方法更可靠:
另外请注意,如果不想区分稀疏数组和关联数组,只需返回
最后,虽然这看起来比本页上的许多“解决方案”要“优雅”得多,但实际上它的效率要高得多。几乎所有的关联数组都会立即被检测到。只有索引数组才会被彻底检查,上面概述的方法不仅彻底检查索引数组,而且会复制它们。 |
![]() |
10
13
我认为下面两个函数是检查“数组是关联的还是数值的”的最佳方法。由于“numeric”只能表示数字键或顺序数字键,因此下面列出了两个检查任一条件的函数:
第一个函数检查每个键是否为整数值。第二个函数检查每个键是否为整数值,另外检查所有键是否从$base开始连续,默认值为0,因此,如果不需要指定另一个基值,则可以省略。如果读取指针移过数组的结尾($my_array),则键($my_array)返回空值,这将结束for循环,如果所有键都是整数,则使for循环后面的语句返回真值。如果不是,则循环将提前结束,因为键的类型为string,并且for循环之后的语句将返回false。后一个函数在每次比较后再加上一个到$base,以便能够检查下一个键的值是否正确。通过严格的比较,还可以检查键是否为整数类型。当省略$base或确保只使用整数调用它时,可以省略for循环第一节中的$base=(int)$base部分。但因为我不能确定每个人,所以我把它放了进去。无论如何,语句只执行一次。我认为这些是最有效的解决方案:
请记住,数组键只能是整数或字符串,而严格数字字符串(如“1”(但不是“01”)将被转换为整数。这使得检查整数键成为除计数之外唯一需要的操作,如果您希望数组是连续的。当然,如果被索引的数组返回false,则可以将该数组视为关联数组。我说“看见”,因为事实上他们都是。 |
![]() |
11
7
此功能可以处理:
这个想法很简单:如果其中一个键不是整数,那么它是关联数组,否则它是连续的。
|
![]() |
12
7
我注意到这个问题有两种流行的方法:一种是
CentOS上php 5.2上程序的输出如下:
php 5.3上的输出产生了类似的结果。显然使用
|
![]() |
13
6
解决这一问题的一种方法是依靠
您可以通过检查编码后返回的第一个字符是否是
|
|
14
5
快速、简洁和记忆效率高。没有昂贵的比较、函数调用或数组复制。 |
![]() |
15
5
已经有很多答案,但下面是Laravel在其ARR类中所依赖的方法:
资料来源: https://github.com/laravel/framework/blob/5.4/src/Illuminate/Support/Arr.php |
![]() |
16
4
通过使用 xarray PHP扩展 您可以非常快地完成此操作(在php 5.6中大约快30倍):
或:
|
![]() |
17
3
我的解决方案:
因此,如果创建了一个列表(非关联数组)
|
![]() |
18
2
我使用的方法如下:
请注意,这并不能解释以下特殊情况:
对不起,帮不了你。它对于大小合适的数组也有一定的性能,因为它不会制作不必要的副本。正是这些小东西使得python和ruby更适合写…P |
![]() |
19
2
这两个得分最高的例子都不能正确地处理数组,比如
|
![]() |
20
2
这也行( demo ):
请注意,此答案的主要目的是告知您
|
![]() |
21
2
我认为标量数组的定义会因应用程序而异。也就是说,一些应用程序将需要更严格的定义什么是标量数组,而一些应用程序将需要更宽松的定义。 下面我介绍了3种不同严格性的方法。
|
![]() |
22
2
我知道向这个庞大的队列添加一个答案有点毫无意义,但是这里有一个可读的O(N)解决方案,它不需要复制任何值:
与其检查这些键是否都是数字的,不如遍历 将 有一个数字数组,并确保它们存在。 |
![]() |
23
2
这是解决办法吗?
警告很明显是数组光标被重置了,但我想说的是,可能在数组被遍历或使用之前就已经使用了函数。 |
![]() |
24
2
在进行了一些本地基准测试、调试、编译器探测、分析和滥用3v4l.org在更多版本之间进行基准测试之后(是的,我收到了停止的警告),并且 和我能找到的每一种变化作比较… 我给你一个有机衍生的 最佳平均最坏情况 关联数组测试函数 最差的 大致与所有其他一般情况相同或更好。
|
![]() |
25
1
再快一点
source
.
适合的编码
|
![]() |
26
1
已经给出了答案,但关于绩效的虚假信息太多了。 我编写了这个小的基准脚本,它表明foreach方法是最快的。 免责声明:以下方法是从其他答案复制粘贴的
结果:
|
![]() |
27
0
除非PHP有一个内置函数,否则您将无法在小于O(N)的情况下完成这项工作——枚举所有键并检查整数类型。实际上,您还希望确保没有孔,因此您的算法可能如下所示:
但是为什么要麻烦呢?假设数组是您期望的类型。如果不是的话,它会在你的脸上爆炸-这是动态编程为你!测试你的代码,一切都会好起来… |
![]() |
28
0
我比较了数组的键和数组的array_values()结果的键之间的差异,后者始终是一个带整数索引的数组。如果键相同,则不是关联数组。
|
![]() |
29
0
修改最流行的答案。
|
![]() |
30
0
在我看来,如果数组的任何键不是整数,例如浮点数和空字符串“”,则该数组应被接受为关联数组。 此外,非序列整数也必须被视为类似于(0,2,4,6)的关联整数,因为这些类型的数组不能通过这种方式与for循环一起使用:
下面函数的第二部分检查键是否被索引。它也适用于负值的键。例如(-1,0,1,2,3,4,5)
|